关于cvWaitKey的问题

fleiss 2010-12-01 06:44:47
自己写了一个从摄像头捕获图像的程序,代码如下:

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

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

int main(int argc, char** argv){

IplImage* pFrame = 0;
CvCapture* pCapture = 0;
if(!(pCapture = cvCaptureFromCAM(-1))) {
printf("Can not open the camera!\n");
return -1;
}
cvNamedWindow("Camera",CV_WINDOW_AUTOSIZE);
cvMoveWindow("Camera",0.0,0.0);
while(pFrame = cvQueryFrame(pCapture)){
if(cvWaitKey(2)==27){
printf("Esc is pressed.\n");
//return 0;
break;
}
cvShowImage("Camera",pFrame);
}

cvReleaseImage(&pFrame);
cvReleaseCapture(&pCapture);
cvDestroyWindow("Camera");

return 0;
}

运行程序的时候报错,错误信息为
OpenCV Error: Bad argument(unrecognized or unsupported array type) in unknown function, file ..\..\..\cxcore\cxarray.cpp, line 991

如果把break那行注掉,把上边的return 0解除注释,程序就不会报错,但无法回到原来的命令行,我必须把command window关掉,然后重新开command window,进入exe文件的文件夹,运行程序

奇怪的是,我在以前的程序里用过完全一样的方法使程序跳出while循环,没有任何问题

望各位指教,谢谢!
...全文
727 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengbingchun 2010-12-02
  • 打赏
  • 举报
回复
cvReleaseImage(&pFrame);
去掉这条语句就能正确执行了
jywzzz 2010-12-02
  • 打赏
  • 举报
回复
cvReleaseImage(&pFrame);

这个去掉,pFrame只是指向,没有分配,所以不用Release
fleiss 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jywzzz 的回复:]
cvWaitKey(n),n是延迟的时间,如果没有在延迟时间内按键,返回-1,if(-1)为true,就跳出结束了。

改成这样看看?

if((c=cvWaitKey(50)) >= 0){
printf("The key is %d.\n",c);
break;
}
[/Quote]

对的,多谢!
糊涂了,糊涂了,if后边只有值为0的时候才判断为假,其余值都是真
jywzzz 2010-12-02
  • 打赏
  • 举报
回复
cvWaitKey(n),n是延迟的时间,如果没有在延迟时间内按键,返回-1,if(-1)为true,就跳出结束了。

改成这样看看?

if((c=cvWaitKey(50)) >= 0){
printf("The key is %d.\n",c);
break;
}
fleiss 2010-12-02
  • 打赏
  • 举报
回复
补充一下,我没按任何键,cvWaitKey返回-1,程序自动结束
fleiss 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jywzzz 的回复:]
cvReleaseImage(&pFrame);

这个去掉,pFrame只是指向,没有分配,所以不用Release
[/Quote]

多谢!
现在按Esc可以退出了,但还有一个问题,我把程序又小修改了一下(红色部分):

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

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

int main(int argc, char** argv){

IplImage* pFrame = 0;
CvCapture* pCapture = 0;
int c;
if(!(pCapture = cvCaptureFromCAM(-1)))
{
printf("Can not open the camera!\n");
return -1;
}
cvNamedWindow("Camera",CV_WINDOW_AUTOSIZE);
cvMoveWindow("Camera",0.0,0.0);
while(pFrame = cvQueryFrame(pCapture)){
if(c=cvWaitKey(2)){
//printf("Esc is pressed.\n");
printf("The key is %d.\n",c);

//return 0;
break;
}
cvShowImage("Camera",pFrame);
}

//cvReleaseImage(&pFrame);
cvReleaseCapture(&pCapture);
cvDestroyWindow("Camera");

return 0;
}

也就是说,我希望当我按下任意键的时候,程序都可以跳出while循环
可现在cvWaitKey返回的值始终是-1,但if还是判断为真,里边的break也执行了
这是为什么呢?

4,446

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧