使用 OpenCV 从相机捕获灰屏

2023-12-20

我在从网络摄像头(内置 hp dv5)捕获图像时遇到问题。唯一的结果是灰屏。这是代码:

#include "StdAfx.h"
#include "cv.h"
#include "highgui.h"
#include <stdio.h>  // A Simple Camera Capture Framework
int main() { 
    CvCapture* capture;
    for (int i = -1;i < 100;i++) {
        capture = cvCaptureFromCAM( i );   
        if( !capture ) {
            fprintf( stderr, "ERROR: capture is NULL \n" ); 

        } else {
            break;
        }
    }
    //cvSetCaptureProperty( capture, CV_CAP_PROP_FPS,15);
    //cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 160 );
    //cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 120 );
    // Create a window in which the captured images will be presented   
    cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE );    // Show the image captured from the camera in the window and repeat   
    while( 1 ) {     // Get one frame     
        IplImage* frame = cvQueryFrame( capture );
        cvGrabFrame(capture);
        frame = cvRetrieveFrame(capture);

        if( !frame ) {
            fprintf( stderr, "ERROR: frame is null...\n" );
            getchar();
            break;
        } else {
            fprintf( stderr, "OK\n" );  
        }
        cvShowImage( "mywindow", frame );     // Do not release the frame!      
        //If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),     //remove higher bits using AND operator     
        int c = cvWaitKey(100);
    }    // Release the capture device housekeeping   
    cvReleaseCapture( &capture );   
    cvDestroyWindow( "mywindow" );   
    return 0; 
}

它是来自 OpenCV wiki 的修改代码。我知道以这种方式找到相机是疯狂的,但它不适用于 -1 或 0。我添加了一些额外的属性(已经评论),但无论如何它都不起作用。提前致谢 :) 问候, 克里斯


我将图像捕获封装到一个“Capture”类中,也许你可以尝试一下。下面是main.cpp、capture.h和capture.cpp,尽情享受吧:)

main.cpp

#include "capture.h"
#include <string>
using namespace std;

    int main(int argc, char* argv[]) {

        // --- read file --- //
        //Capture capture("test.wmv", windowSize, windowSize);

        // --- read camera --- //
        CvSize windowSize = cvSize(640, 480);
        Capture capture(2, windowSize, windowSize);

        while (1) {

            capture.captureNext();

            for (int i = 0; i < capture.channelNum; ++i) {

                ostringstream oss;
                oss << i;
                string winName = "WINDOW-" + (oss.str());

                cvShowImage(winName.c_str(), capture.channelframeList[i]);

            }

            int c = cvWaitKey(30);
            if ( (char) c == 27 ) { // 'Esc' to terminate

                break;
            }

        }

        return 0;

    }

捕获.h

#ifndef _CAPTURE_H_
#define _CAPTURE_H_

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <string>
#include <vector>
#include <iostream>
using namespace std;

enum VIDEO_TYPE {
    CAMMERA = 0,
    VIDEOFILE
};

class Capture {

public:

    Capture(int num, CvSize dispSize, CvSize resolutionSize);
    Capture(string fileName, CvSize dispSize, CvSize resolutionSize);

    int channelNum;
    vector<IplImage*> channelframeList;

    void captureNext();

    ~Capture();

private:

    string m_fileName;
    vector<CvCapture*> m_channelList;

    CvSize m_resolutioSize;
    CvSize m_displaySize;

    void initChannelList(VIDEO_TYPE type);
    void initChannelImgList(CvSize sz);
    IplImage* getNextVideoFrame(CvCapture* pCapture);


};

#endif

捕获.cpp

#include "capture.h"

Capture::Capture(int num, CvSize dispSize, CvSize resolutionSize) {

    channelNum = num;
    m_fileName = "";
    m_resolutioSize = resolutionSize;

    m_channelList.resize(channelNum);
    channelframeList.resize(channelNum);

    initChannelList(CAMMERA);
    initChannelImgList(dispSize);

}

Capture::Capture(string fileName, CvSize dispSize, CvSize resolutionSize) {

    channelNum = 1;
    m_fileName = fileName;
    m_resolutioSize = resolutionSize;

    m_channelList.resize(channelNum);
    channelframeList.resize(channelNum);

    initChannelList(VIDEOFILE);
    initChannelImgList(dispSize);

}

void Capture::captureNext() {

    for (int i = 0; i < channelNum; ++i) {

        IplImage* nextFrame = getNextVideoFrame(m_channelList[i]);
        IplImage* channelFrame = channelframeList[i];
        cvResize(nextFrame, channelFrame);

    }
}

void Capture::initChannelList(VIDEO_TYPE type) {

    if (type == CAMMERA) {

        for (int i = 0; i < channelNum; ++i) {

            m_channelList[i] = cvCreateCameraCapture(i);

            //set resolution
            cvSetCaptureProperty(m_channelList[i], CV_CAP_PROP_FRAME_WIDTH, m_resolutioSize.width);
            cvSetCaptureProperty(m_channelList[i], CV_CAP_PROP_FRAME_HEIGHT, m_resolutioSize.height);

            if ( !(m_channelList[i]) ) {
                cout << "failed to initialize video capture" << endl;
                exit(EXIT_FAILURE);

            }
        }

    } else if (type == VIDEOFILE) {

        const char* fileNameChar = m_fileName.c_str();
        m_channelList[0] = cvCreateFileCapture(fileNameChar);

        if ( !(m_channelList[0]) ) {
            cout << "failed to initialize video capture" << endl;
            exit(EXIT_FAILURE);
        }

    }

}

void Capture::initChannelImgList(CvSize sz) {

    for (int i = 0; i < channelNum; ++i)
        channelframeList[i] = cvCreateImage(sz, 8, 3);

}

IplImage* Capture::getNextVideoFrame(CvCapture* pCapture) {

    IplImage* nextFrame = cvQueryFrame(pCapture);

    if (!nextFrame) {
        cout << "failed to get a video frame" << endl;
        exit(EXIT_FAILURE);
    }

    return nextFrame;

}

Capture::~Capture() {

    for (int i = 0; i < channelNum; ++i) {
        cvReleaseImage( &(channelframeList[i]) );
        cvReleaseCapture(&m_channelList[i]);
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 OpenCV 从相机捕获灰屏 的相关文章

随机推荐

  • 为什么 Next.js 自定义服务器禁用自动静态优化?

    我无法理解为什么在文档中 https nextjs org docs advanced features custom server据说拥有自定义服务器会禁用自动静态优化 https nextjs org docs advanced fea
  • 最短路径算法的一种变体

    我们给定一个带权无向图 具有两个源顶点和两个目标顶点 例如 s1 s2 d1 d2 对于从源 1 到目的地 1 以及从源 2 到目的地 2 的成本定义为 如果仅使用两条路径之一 则使用一条边的成本等于权重 如果两条路径 s1 gt gt d
  • 哪里可以获得犀牛共享资源

    我正在使用 nhibernate 开发一个 asp net mvc 项目 目前我认为 Rhino Commons 会话管理是控制会话的最佳方法 但是我应该从哪里获取 Rhino Commons 呢 我在 Horn Github 上找到了它
  • Laravel - 动态创建表(无需迁移)

    我正在尝试根据管理员请求动态创建一个表 虽然它看起来应该像大多数 Laravel 文档一样简单 但我似乎无法create一张桌子 尽管我可以删除表格 并根据需要添加或删除列 这是我的基本代码模型 use Illuminate Databas
  • 测试项目在 TeamCity -> NUnit 阶段不读取 app.config

    我们正面临着一个奇怪的问题 即 JetBrains TeamCity 在我们的主项目上引发的单元测试 其中少数库项目的测试经常失败 显然 它没有读取配置文件 来自 app config 并很好地存储在项目 gt bin gt 调试 gt p
  • 在 Java 8 中从流创建多值映射

    有没有办法优雅地初始化和填充多值Map
  • 是否可以在 CSS3 选择器中使用 CSS 变量?

    我正在尝试使用 CSS 变量进行一些实验 但我无法让它工作或找到任何有关它的文档 有谁知道是否可以在 CSS3 选择器中使用 CSS var 我做了下面的例子来解释我想做的事情 此示例仅适用于 Chrome JSFIDDLE http js
  • SAS 中的退出与运行语句

    在 SAS 中 退出 和 运行 有什么区别 声明 我不知道何时使用 退出 以及何时使用 运行 例如 为什么是proc datasets using quit but proc contents using run 这可以追溯到 SAS 曾经
  • travis CI 中跳过了 SonarQube Scanner 分析

    有谁知道 SonarQube 扫描仪分析可能被跳过的原因是什么 sonar scanner X Dsonar host url https sonarqube com Dsonar login SONAR TOKEN 08 59 10 16
  • XCode 6.0.1 上的 Apple Mach-O 链接器错误

    我已将 XCode 更新到 6 0 1 在此更新之前 我能够在模拟器和我的设备中构建我的项目 但现在 它给了我Apple Mach O 链接器错误 我冲浪了很多 我已删除 DerivedData 文件夹 仍然有问题 我正在构建一个 Phon
  • 我试图让 UILabel 在 UIScrollView 内部滚动,但它不滚动

    这是我的 m 中 void viewDidLoad super viewDidLoad self scrollView addSubview self contentView self scrollView contentSize self
  • 在“数据工厂”模式下启用发布

    我已在 Azure 数据工厂上启用 Git 我也创建了我的 Git 存储库 当我想创建一个新的管道时 我收到以下消息 您已在数据工厂中启用 GIT 数据工厂 模式下的发布已禁用 请切换回 GIT 模式以进行进一步更改 当我想选择 GitHu
  • CSS伪元素::before(2); :之前和:之前

    我正在使用 css 并且尝试在我的 div 中添加一个元素 之前 就像箭头一样 有什么办法可以实现吗 我尝试了伪 before 但有三个 before 2 before 和 before 它们让我很困惑 它们之间有什么区别 The 内容的
  • Ruby 中检查变量是否为字符串

    还有比下面更惯用的吗 foo class String 我想你正在寻找instance of is a and kind of 将为派生类的实例返回 true class X lt String end foo X new foo is a
  • 如何更改密码框的屏幕键盘

    我有一个盒子 我想要输入仅由数字组成的密码 例如 ATM 卡 PIN 码 最好的方法是什么 要求 密码 带有隐藏数字 输入数字作为默认 唯一 键盘 我尝试过的 我认为 InputScopes 是可行的方法 但我无法在密码框中设置输入范围 我
  • 正则表达式选择标签之间的所有文本

    选择 2 个标签之间的所有文本的最佳方法是什么 例如 所有 之间的文本 pre 页面上的标签 您可以使用 pre pre 用您想要的任何文本替换 pre 并提取第一组 对于更具体的指令 请指定一种语言 但这假设您有非常简单且有效的 HTML
  • Git - 如何查找目录中所有项目的所有“未推送”提交?

    我终于习惯了 Git 在最初的陡峭学习曲线之后 我必须说它非常好 我只是怀念单个文件外部 但那是另一个故事了 然而 我有一个无法解决的问题 我目前正在同时处理十几个项目 它们都是相互关联的 我必须从一个跳到另一个 到处做出改变 到目前为止一
  • 带有无效证书的自定义 NuGet feed

    如何使用 nuget 命令禁用 SSL 证书检查 PS C 软件 gt nuget exe 列表 无法加载服务索引 来源https asd ca api feeds https asd ca api feeds 一个错误 发送请求时发生 底
  • 使用 ManyToMany 的 TomEE + OpenJPA 不起作用

    我认输了 我不明白 这能有多难 我有两个实体User and Group 具有多对多关系 Group管理关系 所以在Group I have Entity Table name GROUPS catalog schema GROUPADMI
  • 使用 OpenCV 从相机捕获灰屏

    我在从网络摄像头 内置 hp dv5 捕获图像时遇到问题 唯一的结果是灰屏 这是代码 include StdAfx h include cv h include highgui h include