0

我正在测试一些我发现的用于捕获网络摄像头视频流的代码,它与我以前为实现相同目标所做的完全不同,但它应该是实现它的适当方式。

这是我以前做的方式:

CvCapture* capture;
IplImage* frame = 0;

while (true)
{
    //Read the video stream
    capture = cvCaptureFromCAM(1);
    if (! capture) break;
    frame = cvQueryFrame(capture);

    //Create a window to display 
    cvNamedWindow("Te estas viendo", CV_WINDOW_NORMAL|CV_WINDOW_KEEPRATIO);

    cvShowImage("Te estas viendo", frame);

    int c = cvWaitKey(10);
    if ( (char)c == 27 ) break;
}

//Clean and release resources
cvReleaseImage(&frame);
cvDestroyAllWindows();

这是测试代码

VideoCapture camera;
camera.open(cameraNumber);
if (!camera.isOpened()) {
    cerr << "ERROR: Could not access the camera or video!" <<endl;
    exit(1);
}

while (true) {
    // Grab the next camera frame.
    cv::Mat cameraFrame;
    camera >> cameraFrame;
    if (cameraFrame.empty()) {
    std::cerr << "ERROR: Couldn't grab a camera frame." <<
    std::endl;
    exit(1);
}

我没有得到第一个错误行,所以它应该打开相机,但总是无法抓取相机帧。

4

2 回答 2

2

您可能在 while 循环中缺少右括号。还要确保在循环namedWindow之外创建。while在每次迭代中创建窗口是昂贵的。见下文:

VideoCapture camera;
camera.open(cameraNumber);
namedWindow("output");

if (!camera.isOpened()) {
    cerr << "ERROR: Could not access the camera or video!" <<endl;
    return -1;
}

while (true) {
    // Grab the next camera frame.
    cv::Mat cameraFrame;
    camera >> cameraFrame;
    if (cameraFrame.empty()) {
        std::cerr << "ERROR: Couldn't grab a camera frame." <<
            std::endl;
        return -1;
    }
    imshow("output", cameraFrame);
    waitKey(10);
}
于 2013-09-05T18:57:34.283 回答
1

查找有关VideoCapture的更多信息。参数device为打开的视频采集设备的ID,0如果你的电脑只有一个摄像头,则通过。这是我测试过的用于从网络摄像头捕获视频的代码。告诉我是否有任何问题。

#include <cv.h>
#include <highgui.h>
using namespace cv;

int main(int argc, char** argv) {
    Mat cameraFrame;
    VideoCapture camera(0);
    if (!camera.isOpened()) {
        std::cerr << "ERROR: Could not access the camera or video!" << std::endl;
        return -1;
    }
    while (true) {
        // Grab the next camera frame.  
        camera >> cameraFrame;
        if (cameraFrame.empty()) {
            std::cerr << "ERROR: Couldn't grab a camera frame." <<
            std::endl;
            return -1;
        }
        namedWindow("camera", CV_WINDOW_AUTOSIZE);
        imshow("camera", cameraFrame);
        char ch = waitKey(25);              
        if (ch == 27) break;
    }
    return 0;
}
于 2013-09-06T00:20:23.520 回答