分别使用OpenCV2和MATLAB获取USB摄像头

分别使用OpenCV2 和MATLAB获取USB摄像头

本人初次接触OpenCV,被网上的各种配置和博客搞的很昏头,再自己各种捣腾和摸索后总结一点小小的经验给网友们分享一下。

关于OpenCV的一些小知识:

  1. 学习OpenCV的网站
    • OpenCV官网
    • OpenCV中文网站
    • 各类大神博客
    • OpenCV Tutorials
      如果英语比较好建议直接看CV官网上的Document,如果不好的话就看中文网上的,没有官网全。
  2. 学习OpenCV的书籍如下推荐:

    • 《学习OpenCV》为英文原著《Learning OpenCV》的翻译本,对于图像处理原理有较多的解释,缺点是基于1.0版本的,版本太旧。
    • 《OpenCV2计算机视觉编程手册》更偏重于实践,针对于OpenCV2.0+版本的,也是必买书之一。
  3. 关于OpenCV版本问题:

    • 这个是最初最困扰我的问题了,我开始下了个OpenCV3.0版本的(网上好像2.4.8也挺多的)然后找了好多网上的source code怎么都跑不通,后来才发现原来好多CSDN上的代码都是基于OpenCV1.0老版本的,老版本的函数类似于以下一些cvCapture, cvLoadImage, cvShowImage, 等等前缀加了cv的函数名,而2.0以上的版本开始向面向对象C++的封装方向发展了,都是基于类的而不是以前调用函数的方式了。
    • 其实高版本的OpenCV中也带有低版本的库,譬如使用2.0以上就要申明以下代码片一,
      而使用OpenCV1.0中的函数时候,可以申明如以下代码片二,而且在一个项目中也可以同时使用不同版本的函数的。
#include 
#include 
#include 
#include 
#include 

由于我在跑网上早起版本OpenCV源码都跑不通,调用的摄像头都是白乎乎的没有任何图像,所以我放弃了OpenCV1.0中的C语言封装,使用基于类的调用的OpenCV2.0及以上版本的类的方法。废话不多说了,下面开始说明如何用OpenCV调用USB摄像头!


一、使用OpenCV2.0+调用USB摄像头

废话不多说先撸代码为敬!
(本人用的vs2013+opencv3.0如何配置请看VS2013+OpenCV3.0)

#include 
#include 
#include 
#include 
#include 

using namespace cv;
using namespace std;

int main()
{
    char c;
    int imgNum = 0;  
    cv::VideoCapture inputVideo,inputVideo_1;   // 这里初始化了两个摄像头,以下的操作只对一个进行
    inputVideo.open(0);   // 打开第一个摄像头
    inputVideo_1.open(1); // 打开第二个摄像头

    int width = inputVideo.get(CAP_PROP_FRAME_WIDTH);   // 获取合适的分辨率
    int height = inputVideo.get(CAP_PROP_FRAME_HEIGHT); // cv默认为640x480
    int rate = inputVideo.get(CAP_PROP_FPS);            // 获取合适的帧率

    inputVideo.set(CAP_PROP_FRAME_WIDTH, 1400);         // 设置分辨率
    inputVideo.set(CAP_PROP_FRAME_HEIGHT, 1200);        // Camera支持的分辨率中随便设置
    inputVideo.set(CAP_PROP_FPS, 30);                   // 设置帧率

    if (!inputVideo.isOpened())
    {
        return -1;
    }
    Mat src;  // 用来储存视频流
    Mat frame;// 用来储存一帧
    stringstream ss;     // 用来存储filename
    string str = ".png"; // 或者用.jpg .bmp都可以
    string str1 = "./";  //可以自行更改路径
    for (;;)
    {
        inputVideo >> src; 
        namedWindow("input", WINDOW_AUTOSIZE); //申明窗口名称
        imshow("input", src);
        c = waitKey(10);    // 检测按键
        if (c == 27) break; // 按下Esc退出
        else if (c == 13)   // 按下Enter拍照
        {
            imgNum++;
            ss.str(""); // 清空string
            ss << "cap_" << imgNum << str;       // 拼接filename,没拍照一次下标加一
            inputVideo.read(frame);              // 获取一帧照片
            cv::imshow("captured image", frame); // 显示
            cv::imwrite(str1 + ss.str(), frame); // 写出到文件
        }
    }
    return 0;
}

在配置成功的情况下该代码是可以直接run的,报错的话就在百度上一个一个搜,总能debug出来的,博主初学也是这个一步一步走过来的。
该代码比较简单,关键来说只用了一个VideoCapture类,该类可以读取摄像头视频流和文件视频流,具体可参考官网的document,这里不作过多解释了。
这里贴出运行的结果,直接运行程序得到两个窗口(本人用的鱼眼相机),和按下回车保存为文件的图像
分别使用OpenCV2和MATLAB获取USB摄像头_第1张图片
这是保存到文件的图像


二、使用MATLAB调用USB摄像头

这里要感慨一下,MATLAB真的太强大了,对于搞工程的人来说真的太方便了。前段时间接触了Calibration的东西,最著名的是张正友标定法,旧版本的MATLAB还需要去官网下Calibration Toolbox ,现在发现比较新版本的MATLAB已经把Calibration集成了,只需要执行cameraCalibrator就可以打开标定界面。真的是思思思阔一。。
++++++++++++++++++++++++++++++++++++++++++++++++
1。使用 imaqhwinfo获取摄像头信息

>> info = imaqhwinfo

info = 

    InstalledAdaptors: {'winvideo'}
        MATLABVersion: '8.6 (R2015b)'
          ToolboxName: 'Image Acquisition Toolbox'
       ToolboxVersion: '4.10 (R2015b)'

2。进一步查看camera的具体参数

>> win_info = imaqhwinfo('winvideo')

win_info = 

       AdaptorDllName: 'C:\MATLAB\SupportPackages\R2015b\osgenericvideoi…'
    AdaptorDllVersion: '4.10 (R2015b)'
          AdaptorName: 'winvideo'
            DeviceIDs: {[1]  [2]}   % 设备ID
           DeviceInfo: [1x2 struct] % 可以用win_info.DevideInfo查看具体信息
>> win_info.DeviceInfo(1)

ans = 

             DefaultFormat: 'MJPG_1024x768'
       DeviceFileSupported: 0
                DeviceName: 'HD USB Camera'
                  DeviceID: 1
     VideoInputConstructor: 'videoinput('winvideo', 1)'
    VideoDeviceConstructor: 'imaq.VideoDevice('winvideo', 1)'
          SupportedFormats: {1x18 cell}

如果要查看其他信息,可以 . 进去查看,这里就不演示了

3。 创建视频输入
obj = videoinput(adaptorname, deviceID, format)
adaptorname:适配器名称,首次可以使用不带参数的imaqhwinfo函数获取
deviceID:设备ID号,首次可以通过imaqhwinfo函数获取
format:视频采集格式,可以通过DeviceInfo的SupportedFormats获取,不填写则使用默认格式

>> inputCamera = videoinput('winvideo',1,'MJPG_1024x768')

Summary of Video Input Object Using 'HD USB Camera'.

   Acquisition Source(s):  input1 is available.

  Acquisition Parameters:  'input1' is the current selected source.
                           10 frames per trigger using the selected source.
                           'MJPG_1024x768' video data to be logged upon START.
                           Grabbing first of every 1 frame(s).
                           Log data to 'memory' on trigger.

      Trigger Parameters:  1 'immediate' trigger(s) on START.

                  Status:  Waiting for START.
                           0 frames acquired since starting.
                           0 frames available for GETDATA.

4。打开视频显示窗口
himage=preview(obj, himage)
obj:视频采集对象
himage:视频预览窗口对应的句柄,也就是说在指定的句柄对象中预览视频,该参数可以空缺
至于预览窗口的关闭和停止可以使用colsepreview和stoppreview函数

>> preview(inputCamera)

得到预览视频为
分别使用OpenCV2和MATLAB获取USB摄像头_第2张图片

5。摄像头捕捉,显示与保存

>> frame = getsnapshot(inputCamera);
>> imshow(frame);
>> imwrite(frame,'capture.jpg');

则会显示figure2,并保存为jpg图片文件
分别使用OpenCV2和MATLAB获取USB摄像头_第3张图片


至此,读取USB摄像头视频流与获取图像并保存的两种方法已经全部介绍完了, 一些微小的工作,希望能帮助大家!

你可能感兴趣的:(摄像头)