【OpenCV2打开摄像头程序】

代码如下:


#include "opencv2/opencv.hpp"

using namespace cv;

int main(int, char**)
{
    VideoCapture cap(0); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
        return -1;

    Mat edges;
    namedWindow("edges",1);
    for(;;)
    {
        Mat frame;
        cap >> frame; // get a new frame from camera
        cvtColor(frame, edges, CV_BGR2GRAY);
        GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
        Canny(edges, edges, 0, 30, 3);
        imshow("edges", edges);
        if(waitKey(30) >= 0) break;
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}

如何获取并设置摄像头拍摄视频的帧率、分辨率呢?

1、帧率。使用getTickCount()、getTickFrequency()。计算出读取一帧所用的时间(单位:秒s)。使用waitKey()来控制视频的帧率。


t = (double)cv::getTickCount(); cv::waitKey(30); cap.read(frame); t = ((double)cv::getTickCount() - t) / cv::getTickFrequency();


2、分辨率。使用double VideoCapture::get(int propId)。设置分辨率使用bool VideoCapture::set(int propId, double value)


int width = cap.get(CV_CAP_PROP_FRAME_WIDTH ); int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT ); cap.set(CV_CAP_PROP_FRAME_WIDTH,width/2); cap.set(CV_CAP_PROP_FRAME_HEIGHT,height/2);



3、视频的翻转


void flip(InputArray src, OutputArray dst, int flipCode);
参数fipCode: 整数,水平发转;0垂直反转;负数,水平垂直均反转。



如下如图所示:代码见链接点击打开链接


python opencv 读取摄像头转低分率帧 opencv获取摄像头帧率_opencv

【OpenCV1打开摄像头程序】

获取摄像头的代码为并且创建窗口显示的代码为:


[cpp]  view plain copy


1. #include "stdafx.h"  
2.   
3. #include <cv.h>  
4. #include <cxcore.h>  
5. #include <highgui.h>  
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. "video", 1);  
17.    
18. //显示视屏  
19. while(1)  
20.   {  
21.       pFrame=cvQueryFrame( pCapture );  
22. if(!pFrame)break;  
23. "video",pFrame);  
24. char c=cvWaitKey(33);  
25. if(c==27)break;  
26.   }  
27.   cvReleaseCapture(&pCapture);  
28. "video");  
29. }


其中必须说一下几个函数用分割线框起来了

具体是这样的:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

cvCreateCameraCapture

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


CvCapture* cvCreateCameraCapture( int index );


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


函数cvCreateCameraCapture给从摄像头的视频流分配和初始化CvCapture结构。目前在Windows下可使用两种接口:Video for Windows(VFW)和Matrox Imaging Library(MIL); Linux下也有两种接口:V4L和FireWire(IEEE1394)。

释放这个结构,使用函数cvReleaseCapture。

返回值为一个


CvCapture ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


CvCapture

视频获取结构


typedef struct CvCapture CvCapture;


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

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

这个是一个很重要的结构   以后无论是读取已有视频还是从摄像头获取都必须用到它

然后的工作就是把视屏显示出来


[cpp]  view plain copy


1. while(1)  
2. {  
3.      pFrame=cvQueryFrame( pCapture );  
4. if(!pFrame)break;  
5. "video",pFrame);  
6. char c=cvWaitKey(33);  
7. if(c==27)break;  
8. }


在这里解释一下为什么显示视屏的时候要循环

进入While循环之后 开始读入视屏文件

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

cvQueryFrame函数

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


IplImage* cvQueryFrame( CvCapture* capture );


capture 视频获取结构。


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

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

如果抓取帧为空   break 打破循环

否则将抓取的那一帧显示在创建的窗口上

cvShowImage("video",pFrame);

当前帧显示后

char c=cvWaitKey(33);
if(c==27)break;

我们等待33ms

如果用户触发了按键,将按键的ASCII值给C

如果C为ESC(ASCII 为27)循环退出

最后释放capture 和window

  cvReleaseCapture(&pCapture);
  cvDestroyWindow("video");

最后释放占用资源