当前位置: 代码迷 >> 综合 >> opencv3-摄像头的使用
  详细解决方案

opencv3-摄像头的使用

热度:141   发布时间:2023-09-18 14:35:21.0

大致把自己在这一部分的思路和遇到的问题记录一下

所说的视频帧就是按序列排放的一组图像,这些图像通过一定的间隔进行排序,也就是帧率,把它们组合起来就是动态的视频了。

接下来就开始介绍opencv中读取USB摄像头和本地视频文件

想要打开USB摄像头,就要指定ID号,也就是0.以上两种读取大致的流程是:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
        
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std ;
using namespace cv ;

int main ( int argc , char ** argv )
{
//打开第一个摄像头
//VideoCapture cap(0);
//打开视频文件
//VideoCapture cap ( "video.avi" );
//检查是否成功打开
if ( ! cap . isOpened ())
{
cout << "Can not open a camera or file." << endl ;
return - 1 ;
}
//获取帧率
double rate=capture.get(CV_CAP_PROP_FPS);
cout<<"rate:"<<rate<<endl;
bool stop(false);
namedWindow("camera frame");
Mat edges ;
//创建窗口
namedWindow ( "edges" , 1 );

while(!stop)
{
Mat frame ;
//从 cap 中读一帧,存到 frame
cap >> frame ;
//判断frame是否为空
if (! frame . empty ()){

//将读到的图像转为灰度图
cvtColor ( frame , edges , CV_BGR2GRAY );
//进行边缘提取操作
GaussianBlur(edges,edges,Size(5,5),1.5,1.5);
Canny ( edges , edges , 0 , 30 , 3 );
//显示结果
imshow ( "result" , edges );
}
//等待 30 秒,如果按键则推出循环
if ( waitKey ( 30 ) >= 0 )
break ;

//退出时会自动释放 cap 中占用资源
return 0 ;
}

打开摄像机有两种方式,一种在定义类时,一种是open()方法
VideoCapture *cap("h.avi");orcap.open("h.avi");

获取视频帧:
//方法1
cap.read(frame);
//方法2
cap.grab();
cap.retrieve(frame);
//方法3
cap>>frame;
视频里有比图像更多的信息,可以获取视频的帧率、帧数、尺寸、格式等。这些信息都可以使用get方法获取到。
double rate=cap.get(CV_CAP_PROP_FPS);long nFrame=static_cast<long>(cap.get(CV_CAP_PROP_FRAME_COUNT));
相对应的还有set方法,其可以设置视频的帧率、亮度,还可以设置特定的位置和帧数读取视频。

isOpened函数用来检测VideoCapture类是否把摄像头打开。

在进行USB摄像头读取中遇到的问题:
opencv3-摄像头的使用


opencv3-摄像头的使用 opencv3-摄像头的使用 opencv3-摄像头的使用

解决办法是调用imshow、cvtColor时要加一条判断不为空的语句。

对于opencv之前的版本,有的使用的是cvCaptureFromCAM(0),我一直没有成功使用过这个。
都是在程序中把上面那个失败的函数改为cvCreateCameraCapture(0),之后的处理流程就跟上面贴出的代码处理流程类似了,只是函数的使用书写方式不同。
希望能给大家一点小小的帮助。

  相关解决方案