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;
如果你把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从摄像头读入图像不能显示的主要内容,如果未能解决你的问题,请参考以下文章