高版本Opencv內置的videoInput庫的使用方法(1)

環境:

Windows XP

QtCreator

Qt4.8.3

Opencv2.4.3


源代碼下載:

《高版本Opencv內置的videoInput庫的使用方法》


特別標註:

有些網站轉載我的文章不標明出處,並且轉載不到位,沒有把相應的鏈接一塊轉過去,比如說下載鏈接或相關文獻的鏈接等,導致一些網友閱讀和使用出現障礙和知識的不連續性,所以在此特別標註:我的這篇文章發表在CSDN博客上,可以到CSDN博客來閱讀。


過程:

有些網友看了我VideoInput庫 + Opencv2.3.1 + 無線攝像頭 + VC2010這篇文章之後,提出了一些問題,

截取一個網友的問題如下:

*********************************************************************************************************************************************

**********************************************************************************************************************************************

對於這個問題,我翻閱了opencv的一些代碼,並且做了一個測試,確實如opencv官網所說的,它們已經把videoInput融入到highgui庫裏面了。現在我就來說說這方面的東東。

先來驗證一下videoInput庫確實有在opencv裏現身。

1、它的完整類定義在“opencv\modules\highgui\src\cap_dshow.cpp裏面,來一張圖以示證明(風格所需

這是在模塊(modules)裏的源碼,主要是用於重新編譯opencv用的。

再來看看這裏(這就非常關鍵了)

在“opencv\build\include\opencv2\highgui\highgui_c.h”裏,聲明瞭我們熟悉的 cvCreateCameraCapture(int index)函數,

其中一部分enum很重要(因爲裏面包含CV_CAP_DSHOW這個東西)


看到沒?圖裏面的陰影部分(它的註釋纔是亮點),

<strong><span style="font-size:18px;">CV_CAP_DSHOW    =700,   // DirectShow (via videoInput)</span></strong>
也就是說這樣使用cvCreateCameraCapture(CV_CAP_DSHOW),就是通過videoInput方式實現攝像頭的創建的。

關於opencv裏面對於videoInput的信息就先列這麼多。下來我就先寫個小程序溜溜。


首先,我下載了至今最新一版的OpenCV-2.4.3.exe

直接解壓縮,我的解壓縮至F盤,(直接可以使用,不需要在編譯),

當然,要使用的話還得加上系統環境變量:F:\opencv\build\x86\vc10\bin (路徑視自己的解壓縮路徑而定)

下來就是在QtCreator上使用了。

使用時主要就是要正確設置opencv頭文件和庫的路徑,它設置在工程的 *.pro文件裏面:

(把我的列舉出來以供參考)

<span style="font-size:14px;">#-------------------------------------------------
#
# Project created by QtCreator 2013-01-11T21:49:08
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = opencvtest
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

INCLUDEPATH +=  F:\opencv\build\include \
                F:\opencv\build\include\opencv \
                F:\opencv\build\include\opencv2

LIBS += F:\opencv\build\x86\vc10\lib\opencv_core243d.lib    \
        F:\opencv\build\x86\vc10\lib\opencv_highgui243d.lib  \
        F:\opencv\build\x86\vc10\lib\opencv_imgproc243d.lib</span>

再下來就是上代碼了:

<span style="font-size:14px;">#include "widget.h"
#include "ui_widget.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <stdio.h>
#include <QMessageBox>

using namespace cv;
using namespace std;

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //CV_CAP_DSHOW在highgui_c.h頭文件裏面定義,代表攝像頭是通過videoInput方式創建的
    CvCapture* capture1 = cvCreateCameraCapture(CV_CAP_DSHOW);	//將圖像文件加載進內存
    CvCapture* capture2 = cvCreateCameraCapture(CV_CAP_DSHOW + 1);
    CvCapture* capture3 = cvCreateCameraCapture(CV_CAP_DSHOW + 2);
    CvCapture* capture4 = cvCreateCameraCapture(CV_CAP_DSHOW + 3);
    cvNamedWindow("lovely1", CV_WINDOW_AUTOSIZE);	//創建圖像窗口,第一個參數作爲與其他函數交互的索引
    cvNamedWindow("lovely2", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("lovely3", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("lovely4", CV_WINDOW_AUTOSIZE);
    IplImage* img1, *img2, *img3, *img4;
    if (!capture1 || !capture2 || !capture3 || !capture4)	//檢測文件是否成功讀入
    {
        QMessageBox::information(this, "msg", "Camera Problem!");
    }
    while(1)
    {
         img1= cvQueryFrame(capture1);
         img2= cvQueryFrame(capture2);
         img3= cvQueryFrame(capture3);
         img4= cvQueryFrame(capture4);

         cvShowImage("lovely1", img1);	//把img圖像顯示在lovely的窗口中
         cvShowImage("lovely2", img2);
         cvShowImage("lovely3", img3);
         cvShowImage("lovely4", img4);
         char c = cvWaitKey(40);	//等待用戶觸發行爲
         if (c == 27)
         {
             break;  //等待ESC鍵
         }
    }
//    cvReleaseCapture(&capture4);  //釋放資源時出現運行錯誤,現在還沒具體搞明白怎麼回事
//    cvReleaseCapture(&capture3);
//    cvReleaseCapture(&capture2);
//    cvReleaseCapture(&capture1);
    cvReleaseImage(&img1);	//釋放img所佔據的內存,“lovely”窗口圖像不會消失
    cvReleaseImage(&img2);
    cvReleaseImage(&img3);
    cvReleaseImage(&img4);
    cvDestroyWindow("lovely1");	//銷燬lovely窗口,同時釋放爲img的一個副本圖像所開闢的內存,圖像消失
    cvDestroyWindow("lovely2");
    cvDestroyWindow("lovely3");
    cvDestroyWindow("lovely4");
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{

}
</span>

再再下來就是運行結果啦:(其中一張是我的銷魂照,大家勿吐,辛苦這麼久了委屈,等的就是亮相這一刻大笑


(看清楚啦,4個攝像頭大笑大笑大笑,3個外置+一個筆記本的)


有人會問,你怎麼知道這裏使用的就是videoInput庫?CV_CAP_DSHOW說白了就是一個整型,我用

cvCreateCameraCapture(0)

cvCreateCameraCapture(1)

cvCreateCameraCapture(2)

cvCreateCameraCapture(3)

也照樣可以實現四個攝像頭呀!(這個確實如此,本人已經證明過

但如果按照這樣理解的話,上面列舉的enum裏面的變量都是可以使用的咯(不就是一個整型嘛);

但這樣想就錯了!(這也是經過我證明的

大家可以把enum裏面的變量一個一個地放到cvCreateCameraCapture裏面試,看看有幾個可用?

接下來,你懂的。


 更多相關內容,請參與下一篇博文《高版本Opencv內置的videoInput庫的使用方法(2)》


文章到此結束


參考:

1、VideoInput庫 + Opencv2.3.1 + 無線攝像頭 + VC2010》


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章