您的位置:首页 > 运维架构

opencv调用是视频图像并且显示

2017-03-17 16:29 330 查看
环境:Ubuntu系统下,USB普通摄像头一枚

代码:有两个版本的,一个是opencv1的,使用cvCreateCameraCapture(ID)保存结果,Iplmage* 保存返回结果。另一版本是opencv2的,使用mat数据类型保存返回结果

/*
opencv1 代码
*/
/*
IplImage* pFrame = NULL;
//Mat *pFrame;
cvNamedWindow("result", 1);
CvCapture* pCapture = cvCreateCameraCapture(-1);
cvSetCaptureProperty(pCapture,CV_CAP_PROP_FRAME_WIDTH,1280);
cvSetCaptureProperty(pCapture,CV_CAP_PROP_FRAME_HEIGHT,960);
while(true)
{
pFrame = cvQueryFrame(pCapture);
if(!pFrame) break;

char c = cvWaitKey(33);
if(c == 32) break;
cvShowImage("result", pFrame);
}*/
/*opencv2代码*/
VideoCapture cap(0);
if(!cap.isOpened()){
printf("capture cannot opened\n");
return -1;
}
Mat edges;
namedWindow("edges",1);

for(int i = 0 ;;i++)
{
Mat frame;
cap>>frame;
cvtColor(frame,edges,CV_BGR2GRAY);
GaussianBlur(edges,edges,Size(7,7),1.5,1.5);
Canny(edges,edges,0,30,3);
imshow("edges",edges);
char c=waitKey(30);
if(c>=0)break;
}
return 0;


代码及其简单就不说了。

有两个坑,一个是找到摄像头的问题,可以进入/dev/目录中,ls一下,然后查看Video有哪几个,一般默认能找到的是video0 或者 video1,一定要查看一下,比较保险,否则很容易找不到摄像头,然后报错

另外一个坑是,网上可以找到的代码是

if(waitKey(30)>=0)break;

后果就是,只执行了一遍就break了。

其中使用到的一个重要的函数是WaitKey

WaitKey函数原型为:

.

C++: int waitKey(int delay=0)

Python: cv2.waitKey([delay]) → retval

C: int cvWaitKey(int delay=0 )

Python: cv.WaitKey(delay=0) → int

C++为例

如果delay = 0 || delay < 0 , 就无限制等待,直到按键按下之后,返回按键ID.

如果delay > 0 , 就等待(delay) ms,如果按下按键,那么返回按键ID,如果在 ( delay ) ms 内,没有按下按键,就会返回-1.

但是使用

int c = waitKey(30); 在不按任何按键打印出来的数值是255

经过思考可知,这个明显应该返回-1才对,255 明显是 8 bit 下的-1,然而int是32位的,没有溢出,所以直接显示出来是255

函数的返回值竟然是int类型,那么应该如何解决呢?

直接使用8bit的

char c = waitKey(30);

这样结果值为255的时候,就溢出成为-1了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息