環境:
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》