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

环境: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值