专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 图形/图像

小白一个有关摄像头输出的有关问题(只能运行一次,再运行就报错)

发布时间:2011-06-27 19:28:35 文章来源:www.iduyao.cn 采编人员:星星草
小白求助:一个有关摄像头输出的问题(只能运行一次,再运行就报错)
程序在每次开机后只能正常运行一次,直接关闭窗户或者是按ESC退出后,再运行就会报错。
报错如下:
“CrossDetect.exe 中的 0x74da812f 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x0027f2e8 处的 cv::Exception。”
求教大神这个是怎么回事啊。

程序源码如下:
#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace cv;

int main()
{
//打开摄像头
VideoCapture cap(0);
Mat im_cam;
//新建一个窗口cam,用于显示摄像头拍摄图像
namedWindow("cam",WINDOW_AUTOSIZE);
while(1)
{
cap>>im_cam;
char c=waitKey(30);
imshow("cam",im_cam);
if(c==27)break;
}
cap.release();
destroyWindow("cam");
return 0;
}


但是下面这个摄像头输出程序每次运行时都可以正确运行:
#include <cv.h>   
#include <cxcore.h>   
#include <highgui.h>   
   
int main( int argc, char** argv )  
{  
  //声明IplImage指针   
  IplImage* pFrame = NULL;  
  
 //获取摄像头   
  CvCapture* pCapture = cvCreateCameraCapture(0);  
   
  //创建窗口   
  cvNamedWindow("video", 1);  
   
  //显示视屏   
  while(1)  
  {  
      pFrame=cvQueryFrame( pCapture ); 
      char c=cvWaitKey(33);
      if(!pFrame)break;  
      cvShowImage("video",pFrame);    
      if(c==27)break;  
  }  
  cvReleaseCapture(&pCapture);  
  cvDestroyWindow("video");  
}   

------解决思路----------------------
貌似是 因为太快,没有取到图片,
可以在  cap>>im_cam;  之后加上

if(im_cam.empty()) continue;


你可以运行的程序也有类似的代码
if(!pFrame)break;  

至于为什么取不到图片,就不知道了。

------解决思路----------------------
引用:
Quote: 引用:

貌似是 因为太快,没有取到图片,
可以在  cap>>im_cam;  之后加上

if(im_cam.empty()) continue;


你可以运行的程序也有类似的代码
if(!pFrame)break;  

至于为什么取不到图片,就不知道了。

加上以后是可行了。不过,如果不加这个判断,而是在 cap>>im_cam后面加waitKey延时,不管延时多久,还是会报错。请问下这个方法是错在哪里啊?


要加 也应该加在 cap>>im_cam 之前吧

------解决思路----------------------
引用:
Quote: 引用:

要加 也应该加在 cap>>im_cam 之前吧

加它前面确实好了,不过这是为什么啊。。


你一个loop早早地完成了,取走cap的第一帧,但之后的loop进来后,cap的第二帧还没拍出来,就只能返回NULL
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: