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 。

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


### 如何验证摄像头是否被操作系统正确识别 为了确认操作系统的摄像头设备是否正常工作并能被程序访问,可以通过以下方式完成测试: #### 使用命令行工具检测硬件状态 在 Windows 和 Linux 系统上,分别有特定的命令来枚举连接的摄像头设备。 - **Windows**: 可以通过 `Device Manager` 查看摄像头是否存在以及是否有驱动错误。如果需要更详细的调试信息,可以运行 PowerShell 命令 `Get-PnpDevice -Class Camera` 来获取当前已安装的摄像头列表及其状态[^1]。 - **Linux**: 利用终端执行 `ls /dev/video*` 或者借助 `v4l2-ctl --list-devices` 工具查看视频输入设备的信息。 #### 测试 Python 中 OpenCV摄像头访问功能 编写一段简单的脚本可以直接调用本地默认相机进行画面捕获尝试。以下是具体代码实现: ```python import cv2 def test_camera(index=0, wait_time=5000): cap = cv2.VideoCapture(index) if not cap.isOpened(): print("无法打开摄像头") return False ret, frame = cap.read() if ret: cv2.imshow('Camera Test', frame) key = cv2.waitKey(wait_time) & 0xFF if key == ord('q'): pass else: print("未能成功读取帧") cap.release() cv2.destroyAllWindows() test_camera() # 默认索引为0代表第一个可用摄像装置 ``` 上述代码片段会启动指定编号(通常从零开始计数)的物理或者虚拟摄录单元,并显示一秒钟左右的第一张捕捉到的画面;如果没有发现任何影像源,则给出提示消息表明失败原因可能在于硬件未插好或者是软件层面权限不足等问题存在[^3]。 另外值得注意的是,在某些特殊情况下即使硬件本身完好无损也可能因为缺乏适当的操作系统级授权而导致应用程序层面上看起来像是不存在该外设一样——比如当涉及到了隐私保护机制较严格的 macOS 平台时就需要额外注意给予相应 Applet Store 应用必要的媒体录制许可才行[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值