2

我需要一个程序来从多个网络摄像头捕获图片并将它们自动保存在 Windows Vista 中。我从这个链接得到了基本代码。该代码在 Window XP 中运行,但当我尝试在 Vista 上使用它时,它显示“失败”。每次执行时都会弹出不同的错误。如果我使用SDK平台会有帮助吗?有没有人有什么建议?

4

2 回答 2

2

我无法在多个网络摄像头上测试这个,因为我只有一个,但我确信OpenCV2.0应该能够处理它。下面是一些带有一个网络摄像头的示例代码(我使用 Vista),可以帮助您入门。

#include <cv.h>
#include <highgui.h> 

using namespace cv;    

int main()
{
    // Start capturing on camera 0
    VideoCapture cap(0);
    if(!cap.isOpened()) return -1;

    // This matrix will store the edges of the captured frame
    Mat edges;
    namedWindow("edges",1);

    for(;;)
    {
    // Acquire the frame from cap into frame
    Mat frame;
    cap >> frame;

    // Now, find the edges by converting to grayscale, blurring and then Canny edge detection
    cvtColor(frame, edges, CV_BGR2GRAY);
    GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
    Canny(edges, edges, 0, 30, 3);

    // Display the edges and the frame
    imshow("edges", edges);
    imshow("frame", frame);
    // Terminate by pressing a key
    if(waitKey(30) >= 0) break; 
    }
return 0;
}

笔记:

矩阵边缘是在第一帧处理期间分配的,除非分辨率突然改变,否则每个下一帧的边缘图都会重复使用相同的缓冲区。

如您所见,代码非常干净易读!我从 OpenCV 2.0 文档 (opencv.pdf) 中提取了这个。

该代码不仅显示来自网络摄像头的图像(下frame),而且还进行实时边缘检测!这是我将网络摄像头对准显示器时的屏幕截图:)

截图 http://img245.imageshack.us/img245/5014/scrq.png

如果您希望代码仅显示来自一台摄像机的帧:

#include <cv.h>
#include <highgui.h>

using namespace cv;

int main()
{
    VideoCapture cap(0);
    if(!cap.isOpened()) return -1;
    for(;;)
    {
    Mat frame;
    cap >> frame;
    imshow("frame", frame);
    if(waitKey(30) >= 0) break;
    }
return 0;
}
于 2009-11-02T02:46:02.763 回答
0

如果程序在 UAC 关闭或管理员运行时运行,请确保您选择保存结果的位置位于用户的我的文档文件夹等可写位置。一般来说,根文件夹和程序文件文件夹对普通用户是只读的。

于 2009-11-02T19:13:43.003 回答