opencv从摄像头读入图像不能显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv从摄像头读入图像不能显示相关的知识,希望对你有一定的参考价值。

我用OpenCV编了一段程序,其实就是书上的,编译都对,但是不能在窗口显示图像,调试运行时在 IplImage* frame;这就错了,是为什么呢??顺便,我的是USB摄像头,不需要驱动的。程序如下,哪位高手能帮我解决一下,感激不尽!
#include<iostream.h>
#include<cv.h>
#include<highgui.h>
#include<cxcore.h>
#include<cvcam.h>
#include<stdio.h>

void captureCAM(CvCapture* capture)

IplImage* frame;
int c;
while(true)

frame=cvQueryFrame(capture);
/*if(!frame)
//break;
if((c=cvWaitKey(100))==27)


break;
*/
cvShowImage("Demo",frame);
cvReleaseImage(&frame);
cvWaitKey(0);



int main()

CvCapture* capture;
capture=cvCaptureFromCAM(-1);
if(!capture)

printf("Could not initialize capturing...\n");
return -1;

cvNamedWindow("Demo",1);
captureCAM(capture);
cvReleaseCapture(&capture);
cvDestroyWindow("Demo");

return 0;

我用usb摄像头把你的程序跑一遍,出现Error Handler: Unknown error code -49 (Deallocation error) in function cvFree_ C:\...\cxcore\src\cxalloc.cpp,然后读了读你的程序,问题在于:while循环里面是不应该有“cvReleaseImage(&frame);”的。删了以后再跑了一遍,成功。

如果你把Release那句删了还是不能解决,那么还有以下可能:
1. 用C和C++两种不同的语言编译。
但如果你在build时没有问题,则和你选取语言、选择编译方式无关。
2. 摄像头。
我以前也遇到过你的问题,我用的是Vista系统+内置摄像头,跑程序的时候Demo窗口里就是一片灰色。而且摄像头在msn等其它程序里可用。断点调试可以跑到程序末尾,其它地方查错也没查出错误来,最后决定外接usb摄像头,就解决了。

btw,你说这段程序是照书搬下来的,那我给你讲一遍这段程序在讲什么吧。我把captureCAM子程序放回main里面,你看起来方便一些。

int main()
CvCapture* capture;
IplImage* frame;

capture=cvCaptureFromCAM(-1);
//建议用“cvCapture* cvCreateCameraCapture (int index);”其中参数index为CV_CAP_ANY(或者用数值写,就是0)。程序末尾的cvReleaseCapture与之对应。

if(!capture)
printf("Could not initialize capturing...\n");
return -1;


cvNamedWindow("Demo",1);
//cvNamedWindow和cvDestroyWindow为一对functions,分别是打开命名为xxx的窗口和关闭xxx窗口。

while(1)
frame=cvQueryFrame(capture);
if(!frame) break;
cvShowImage("Demo",frame);
if (cvWaitKey(100)==27) break;

//在while循环中,用cvQueryFrame读取capture中的一帧,并将指向该帧的指针返回到类型为IplImage*的变量frame中。
//如果读取失败则跳出while循环。
//在名为Demo的窗口输出该帧。
//int cvWaitKey函数在HighGUI.h里面,在显示该帧时wait for 100ms接受键盘输入,并返回输入键的ASCII码。其中27表示Esc键,按下此键跳出循环。

//在以上的while循环中将capture的每一帧顺序输出显示。以下都是善后工作。

cvReleaseCapture(&capture);
//完成后,释放相应内存。

cvDestroyWindow("Demo");
//关闭该窗口

return 0;
返回
参考技术A opencv对图像格式要求还是挺高的,avi的也不一定能显示,还得是opencv支持的avi格式。你单步运行试试
,如果pFrame为空就没有读出图像,有可能是图像格式的问题。
参考技术B int main(int argc,char** argv)

cvNamedWindow("Demo");
CvCapture* capture=cvCreateCameraCapture(0);
IplImage* frame;
while(1)

frame=cvQueryFrame(capture);
if(!frame) break;
cvShowImage("Demo",frame);
char c=cvWaitKey(50);
if(c==27) break;

cvReleaseCapture(&capture);
cvDestroyWindow("Demo");


这个代码是我吧编的,每50ms从摄像头取一张图像,我的机器摄像头自带的,可以运行的,LZ可以试试

捕获 OpenCV 后图像显示为绿色

【中文标题】捕获 OpenCV 后图像显示为绿色【英文标题】:image appears green after capture OpenCV 【发布时间】:2016-05-16 07:52:12 【问题描述】:

我有这段代码,它使用 OpenCV 从网络摄像头捕获图像:

#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

int main( )

    VideoCapture cap(0); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
        return -1;

    Mat meter_image;
    cap >> meter_image;

    imwrite("/boneCV-master/img.jpg", meter_image);

    return 0;

我得到以下图像作为输出。

以前它工作正常。我不知道发生了什么。我在谷歌搜索时尝试了所有代码中最简单的,但没有任何效果。请让我知道它可能有什么问题。

提前致谢。

编辑

我忘记提及的一件事是我正在开发 beagleBone Black。这段代码很适合我的 mac。

【问题讨论】:

有时由于相机驱动程序中的某些故障,捕获的第一帧全为零,请尝试获取更多帧。 @ATulSingh 我忘了在我的问题中提到 Beaglebone black。请检查我的编辑 很抱歉,我对这款 Beaglebone black 没有任何想法。你可以做的一件事就是调试 OpenCV 捕获代码,进入这个可能你会发现一些东西,祝你好运(Y) 【参考方案1】:

也许添加帧检查会有所帮助。

Mat meter_image;
while(meter_image.empty())
    cap >> meter_image;

但存在无限循环的风险。

【讨论】:

检查我的编辑...我忘了在这里提到 BeagleBone Black 对不起,我不知道这个设备。我用谷歌搜索了一下,发现了这个tutorial。我猜你会用它。如果没有检查它。也许你忘了给编译器添加一些选项。

以上是关于opencv从摄像头读入图像不能显示的主要内容,如果未能解决你的问题,请参考以下文章

opencv for android 如何实现后台启动摄像头,不显示预览界面

求C++调用opencv设置获取摄像头图像大小的方法

opencv imshow()

opencv调用摄像头函数

opencv不能录制桌面的视频吗?只能录制摄像头的视频

如何opencv读取摄像头并保存每一帧图像?