C++ 从Open CV捕获网络视频

C++ 从Open CV捕获网络视频,c++,opencv,video-capture,C++,Opencv,Video Capture,我正在测试我发现的一些用于捕获网络摄像机视频流的代码,这与我过去实现相同的功能的方法有很大不同,但这应该是合适的方法 这是我过去的做法: CvCapture* capture; IplImage* frame = 0; while (true) { //Read the video stream capture = cvCaptureFromCAM(1); if (! capture) break; frame = cvQueryFrame(capture);

我正在测试我发现的一些用于捕获网络摄像机视频流的代码,这与我过去实现相同的功能的方法有很大不同,但这应该是合适的方法

这是我过去的做法:

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);
}
这是测试代码:

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);
}
摄像机;
照相机。打开(照相机编号);
如果(!camera.isOpened()){

cerr您可能缺少while循环中的结束括号。另外,请确保在
while
循环之外创建
namedWindow
。在每次迭代中创建窗口的成本都很高。请参阅以下内容:

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);
}
摄像机;
照相机。打开(照相机编号);
名称(“输出”);
如果(!camera.isOpened()){

cerr您可能缺少while循环中的结束括号。另外,请确保在
while
循环之外创建
namedWindow
。在每次迭代中创建窗口的成本都很高。请参阅以下内容:

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);
}
摄像机;
照相机。打开(照相机编号);
名称(“输出”);
如果(!camera.isOpened()){

cerr查找有关的详细信息。参数
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;
}
#包括
#包括
使用名称空间cv;
int main(int argc,字符**argv){
摄影框;
摄像机(0);
如果(!camera.isOpened()){
标准:cerr摄像机框架;
if(cameraFrame.empty()){

std::cerr查找有关的更多信息。参数
设备
是打开的视频捕获设备的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;
}
#包括
#包括
使用名称空间cv;
int main(int argc,字符**argv){
摄影框;
摄像机(0);
如果(!camera.isOpened()){
标准:cerr摄像机框架;
if(cameraFrame.empty()){

STR::我不断地得到“错误:不能抓取相机框架。”“留言”。无论如何,相信阿列克谢。你为“CopyAuthNobe”提供什么?- 1(任何可用的)应该是一个好主意,0(第一)是下一个最好的,尝试一下。-绝对喜欢C++ API(如你的第二个例子)。我想这和旧的c一有关,但我找不到解决的办法。或者不知道我是否应该继续获得“错误:无法抓取相机帧。”“消息。无论如何,相信亚历克赛。你为“cameraNumber”输入了什么?”-1(任何可用的)应该是个好主意,0(第一个)下一个最好的方法,尝试一下。-绝对喜欢C++ API(如在你的第二个例子中)对于旧的c版本!我认为这与此有关,但我找不到解决方法。或者不知道我是否应该降级您在其上使用的OpenCV版本?@Diego我使用的是版本2.4.6,它对我来说运行良好。这可能是OpenCV安装的问题,很难说。@Diego在Windows上使用OpenCV版本2.4.6(使用CMake安装)有趣的是,我并没有真正使用CMake,我只是将opencv提取到我的硬盘上,将
C:\opencv\build\x64\vc11\bin
添加到我的路径,然后在Visual Studio中添加适当的设置来绑定库。@Diego你说代码在2.4.5上运行,那么你知道opencv安装是否存在问题了吗:试试简单的方法代码(在2.4.6上),例如从文件加载图像。如果没有问题,请用我上面的代码替换测试代码。您在上面使用了什么Open CV版本?@Diego我使用的是2.4.6版本,对我来说效果很好。这可能是OpenCV安装的问题,很难说。@Diego在Windows上安装的OpenCV版本为2.4.6(使用CMake安装)有趣的是,我并没有真正使用CMake,我只是将opencv提取到我的硬盘上,将
C:\opencv\build\x64\vc11\bin
添加到我的路径,然后在Visual Studio中添加适当的设置来绑定库。@Diego你说代码在2.4.5上运行,那么你知道opencv安装是否存在问题了吗:试试简单的方法代码(在2.4.6中),例如从文件加载图像。如果没有问题,请用上面的“我的代码”替换测试代码。