OpenCV打开摄像头失败

在尝试使用OpenCV打开摄像头时遇到问题,程序运行后出现选择视频源并秒退。通过查阅文档发现cvCreateCameraCapture(int index)函数可以选择摄像头,实际测试中cvCaptureFromCAM仅接受-1和0。将参数-1改为0后成功打开摄像头。官方文档对参数解释不详,问题尚待进一步研究。此外,若要处理avi视频,只需将其与exe在同一目录下,并在命令行输入文件名即可。
摘要由CSDN通过智能技术生成
<span style="font-family: Arial, Helvetica, sans-serif;">#include <stdio.h></span>
 
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
 
int main( int argc, char** argv )
{
  //声明IplImage指针
  IplImage* pFrame = NULL; 
  IplImage* pFrImg = NULL;
  IplImage* pBkImg = NULL;
 
  CvMat* pFrameMat = NULL;
  CvMat* pFrMat = NULL;
  CvMat* pBkMat = NULL;
 
  CvCapture* pCapture = NULL;	
 //

  int nFrmNum = 0;
 
  //创建窗口
  cvNamedWindow("video", 1);
  cvNamedWindow("background",1);
  cvNamedWindow("foreground",1);
  //使窗口有序排列
  cvMoveWindow("video", 30, 0);
  cvMoveWindow("background", 360, 0);
  cvMoveWindow("foreground", 690, 0);
 
 
 
  if( argc > 2 )
    {
      fprintf(stderr, "Usage: bkgrd [video_file_name]\n");
      return -1;
    }
 
  //打开摄像头
  if (argc ==
打开摄像头的过程分为两个步骤,首先是打开摄像头设备并获取摄像头的属性,接着是从摄像头中读取图像数据。 第一步,打开摄像头设备并获取摄像头属性: 首先,需要引入opencv库并创建一个VideoCapture对象,通过指定摄像头设备的ID来打开摄像头。例如,如果要打开第一个摄像头,则设备ID为0,代码如下所示: ```c++ #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 打开摄像头设备,并获取摄像头属性 VideoCapture cap(0); if (!cap.isOpened()) { // 如果无法打开摄像头设备 cout << "Error opening camera!" << endl; return -1; } // 获取摄像头图像的宽、高、帧率等属性 int width = cap.get(CAP_PROP_FRAME_WIDTH); int height = cap.get(CAP_PROP_FRAME_HEIGHT); double fps = cap.get(CAP_PROP_FPS); cout << "Camera opened successfully! Properties:" << endl; cout << "Width: " << width << " px" << endl; cout << "Height: " << height << " px" << endl; cout << "FPS: " << fps << endl; // 程序继续执行... return 0; } ``` 在上面的代码中,我们首先创建了一个VideoCapture对象cap,通过指定设备ID为0来打开第一个摄像头设备。在打开摄像头之后,我们使用cap.get()方法获取了摄像头图像的宽、高、帧率等属性,并将这些属性打印到控制台中。 第二步,从摄像头设备中读取图像数据: 接下来,我们使用cap.read()方法从摄像头设备中读取图像数据,代码如下所示: ```c++ #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 打开摄像头设备,并获取摄像头属性 VideoCapture cap(0); if (!cap.isOpened()) { // 如果无法打开摄像头设备 cout << "Error opening camera!" << endl; return -1; } // 获取摄像头图像的宽、高、帧率等属性 int width = cap.get(CAP_PROP_FRAME_WIDTH); int height = cap.get(CAP_PROP_FRAME_HEIGHT); double fps = cap.get(CAP_PROP_FPS); cout << "Camera opened successfully! Properties:" << endl; cout << "Width: " << width << " px" << endl; cout << "Height: " << height << " px" << endl; cout << "FPS: " << fps << endl; // 从摄像头中读取图像数据,循环读取直到用户按下q键 while (1) { Mat frame; bool success = cap.read(frame); if (!success) { // 如果读取失败 cout << "Error reading frame from camera!" << endl; break; } imshow("Camera", frame); // 等待20ms,处理按键事件 char c = waitKey(20); if (c == 'q') { // 如果用户按下q键,则退出循环 break; } } // 释放摄像头对象 cap.release(); // 程序继续执行... return 0; } ``` 在上面的代码中,我们使用了cap.read()方法循环读取摄像头中的图像数据,并使用imshow()方法显示图像。为了让窗口可以响应按键事件,我们还使用了waitKey()方法等待用户按下按键,并判断用户是否按下了q键来退出循环。最后,在程序结束之前,我们需要调用cap.release()方法释放摄像头对象,这样才能让其他程序或进程可以访问摄像头设备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值