opencv调用是视频图像并且显示
2017-03-17 16:29
330 查看
环境:Ubuntu系统下,USB普通摄像头一枚
代码:有两个版本的,一个是opencv1的,使用cvCreateCameraCapture(ID)保存结果,Iplmage* 保存返回结果。另一版本是opencv2的,使用mat数据类型保存返回结果
代码及其简单就不说了。
有两个坑,一个是找到摄像头的问题,可以进入/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了
代码:有两个版本的,一个是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了
相关文章推荐
- opencv调用是视频图像并且显示
- 利用MFC和opencv读取视频显示图像方法
- 用opencv读取图像,并且显示
- python3.4实现调用opencv3.1.0显示图像
- OpenCV2.4.11调用摄像头显示拍摄视频出错
- Opencv调用摄像头,显示摄像头图像
- 在MFC控件中显示opencv库中的图像或者视频用的CvvImage
- 利用opencv类库在MFC显示摄像头视频并且保存摄像头视频
- opencv2/3播放视频实现进度条显示拖动、快进、快退、逐帧播放、显示当前帧于图像
- OpenCV图像或视频显示在VC对话框中的方法
- 《OpenCV》Part2 OpenCV3.1.0调用摄像头显示视频并拍照
- OpenCV学习 利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- OpenCV+MFC显示图像/视频
- OpenCV中如何载入图像并且转换成灰度显示图像直方图
- OpenCV成长之路4:加载一个视频并且显示
- 在MFC控件中显示opencv库中的图像或者视频用的CvvImage
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- OpenCV学习笔记01--图像和视频的显示
- [电子书]C++敏捷开发/OpenCV+MFC显示图像/视频
- 使用Opencv调用摄像头并在MFC中进行视频显示