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

来源:互联网 发布:模具编程软件 编辑:程序博客网 时间:2024/06/05 02:53

环境: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了

0 0