opencv无法读取摄像头

ubuntu 下opencv2.4.0 打开摄像头

分类: OpenCV 484人阅读 评论(1) 收藏 举报

最近在做使用opencv 打开摄像头获取视频的东西,用以下的例子尝试打开摄像头发现失败,我用的是外接的 USB 摄像头,刚开始以为是函数参数的问题,试了好多也没有成功。

下面是例子程序。

  1. #include <QApplication>  
  2. #include <opencv/highgui.h>  
  3. #include <opencv/cv.h>  
  4. #include <opencv/cxcore.h>  
  5. #include <QtGui>  
  6.   
  7. int main(int argc,char ** argv)  
  8. {  
  9.     //声明IplImage指针  
  10.     IplImage *pFrame = NULL;  
  11.   
  12.     //获取摄像头  
  13.     CvCapture *pCapture = cvCreateCameraCapture(-1);  
  14.   
  15.     //创建窗口  
  16.     cvNamedWindow("video",1);  
  17.   
  18.     //显示视频  
  19.     while(1)  
  20.     {  
  21.         pFrame = cvQueryFrame(pCapture);  
  22.   
  23.         if(!pFrame)  
  24.             break;  
  25.         cvShowImage("video",pFrame);  
  26.   
  27.         char c = cvWaitKey(33);  
  28.   
  29.         if(c == 27)  
  30.             break;  
  31.   
  32.     }  
  33.   
  34.     //最后释放capture 和window  
  35.     cvReleaseCapture(&pCapture);  
  36.   
  37.     cvDestroyWindow("video");  
  38.   
  39.     return 0;  
  40. }  

几个函数简单介绍一下:

1、cvCreateCameraCapture

初始化从摄像头中获取视频

CvCapture* cvCreateCameraCapture( int index );

index

        要使用的摄像头索引。如果只有一个摄像头或者用哪个摄像头也无所谓,那使用参数-1应该便可以。

        使用参数-1,发现打不开摄像头,我以为是参数的问题,网上找了一下,说是只接受 -1 和 0两个参数,我也试了,没用。

  2、CvCapture

视频获取结构

typedef struct CvCapture CvCapture;

结构CvCapture 没有公共接口,它只能被用来作为视频获取函数的一个参数。

然后就是循环读入视频文件

 3、cvQueryFrame函数

从摄像头或者文件中抓取并返回一帧

IplImage* cvQueryFrame( CvCapture* capture );

capture

    视频获取结构。

视频获取结构

        函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。 抓取后,capture被指向下一帧,可用cvSetCaptureProperty调整capture到合适的帧。 

  1. while(1)  
  2.     {  
  3.         pFrame = cvQueryFrame(pCapture);  
  4.   
  5.         if(!pFrame)           //如果抓取帧为空  ,break 打破循环  
  6.             break;  
  7.         cvShowImage("video",pFrame);  //否则将抓取的那一帧显示在创建的窗口上  
  8.   
  9.         char c = cvWaitKey(33); //等待33ms,如果触发了按键,将按键的ASCII值给c  
  10.   
  11.         if(c == 27)     //如果c为ESC(ASCII 为27)循环退出  
  12.             break;  
  13.   
  14.     }  

        如上所说,cvCreateCameraCapture( int index ) 函数的参数试了很多,发现还是不能打开摄像头,后来网上找了一下,发现有些包还需要安装一下,以下是配置摄像头需要的所有包。

sudo apt-get install ffmpeg libavcodec-dev libavcodec52 libavformat52 libavformat-dev

sudo apt-get install libgstreamer0.10-0-dbg libgstreamer0.10-0 libgstreamer0.10-dev

sudo apt-get install libxine1-ffmpeg libxine-dev libxine1-bin

sudo apt-get install libunicap2 libunicap2-dev

sudo apt-get install libdc1394-22-dev libdc1394-22 libdc1394-utils

sudo apt-get install swig

sudo apt-get install libv4l-0 libv4l-dev

sudo apt-get install python-numpy

sudo apt-get install libpython2.6 python-dev python2.6-dev 

        以上包全部安装之后,需要重新编译OpenCV,依次 cmake CMakeLists.txt,make,sudo make install 。

然后重新编译例子程序,摄像头就能打开了。


使用OpenCV实时读取摄像头是一种常见的计算机视觉操作,主要用于捕获视频流并进行实时处理。以下是使用Python语言和OpenCV库实现该功能的基本步骤: 1. 首先确保已经安装了OpenCV库。如果未安装,可以通过pip安装命令进行安装: ``` pip install opencv-python ``` 2. 导入OpenCV库,并创建一个VideoCapture对象,该对象负责从默认摄像头(通常为0)或指定的摄像头捕获视频帧。如果使用默认摄像头,可以使用`cv2.VideoCapture(0)`。 3. 接下来,进入一个循环,在循环中不断读取摄像头的帧,对每一帧进行处理,然后显示。使用`cv2.read()`方法读取帧,该方法会返回一个布尔值表示是否成功读取下一帧,并且如果成功,帧会被存储在返回的图像对象中。 4. 最后,显示读取的帧,并在需要的时候通过`cv2.waitKey()`函数等待一定时间(如1毫秒),以控制帧的读取速度。 以下是一个简单的示例代码: ```python import cv2 # 创建VideoCapture对象 cap = cv2.VideoCapture(0) while True: # 读取当前帧 ret, frame = cap.read() # 如果正确读取帧,ret为True if not ret: print("无法读取摄像头") break # 在这里可以对frame进行处理 # 显示结果帧 cv2.imshow('Camera', frame) # 按下'q'键时退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放VideoCapture对象 cap.release() # 关闭所有OpenCV窗口 cv2.destroyAllWindows() ``` 这段代码会打开默认摄像头,并实时显示捕获到的视频。用户可以按下'q'键退出视频显示界面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值