集合OpenCV的視頻功能和QCamera的攝像頭接口,開發出易於理解的、結構簡單的攝像頭控制和採集框架。git
MainWindow
:
:MainWindow(QWidget
*parent)
: QMainWindow(parent),
ui(
new Ui
:
:MainWindow)
{
ui
-
>setupUi(
this);
timer
=
new QTimer(
this);
imag
=
new QImage();
// 初始化
connect(timer, SIGNAL(timeout()),
this, SLOT(readFarme()));
// 時間到,讀取當前攝像頭信息
bMethod
=
false;
//是否使用算法
//填充界面控件
const QList
<QCameraInfo
> availableCameras
= QCameraInfo
:
:availableCameras();
for (
const QCameraInfo
&cameraInfo
: availableCameras)
{
ui
-
>comboCamera
-
>addItem(cameraInfo.description());
}
ui
-
>comboCamera
-
>setCurrentIndex(
0);
bCameraOpen
=
false;
//顯示的圖像自動縮放
ui->label->setScaledContents(true);
ui->label_2->setScaledContents(true);
}
在界面初始化的時候,就直接填充界面。注意這裏
setScaledContents的設置使得圖像可以填充滿整個窗體。
另外一個很是關鍵的一句就是
connect(timer, SIGNAL(timeout()),
this, SLOT(readFarme()));
// 時間到,讀取當前攝像頭信息
至關於ontimer,很是直觀吧。
// 從攝像頭中抓取並返回每一幀
void MainWindow
:
:readFarme()
{
videocapture
-
>read(matFrame);
//是否圖像處理
Mat tmp;
if(bMethod)
//這裏只是簡單地實現一個Canny算法
{
cvtColor(matFrame,tmp,COLOR_BGR2GRAY);
cv
:
:Canny(tmp,tmp,
100,
255,
3);
cvtColor(tmp,matDst,COLOR_GRAY2BGR);
}
else
{
matDst
= matFrame.clone();
}
// 格式轉換
QPixmap qpixmap
= Mat2QImage(matDst);
// 將圖片顯示到label上
ui
-
>label
-
>setPixmap(qpixmap);
}
這裏使用了
Mat2QImage函數,將圖像轉換爲
qpixmap,而且顯示在
label上
//打開磁盤上的圖片
void MainWindow
:
:on_pushButton_clicked()
{
//第3個參數表示查找文件時從哪一個目錄開始,若是爲"."的話,表示從該工程目錄開始查找,最後那個參數的過濾器的名字之間
//要用空格,不然識別不出來
QString img_name
= QFileDialog
:
:getOpenFileName(
this, tr(
"Open Image"),
".",tr(
"Image Files(*.png *.jpg *.jpeg *.bmp)"));
if(img_name
==
"")
return;
//toAscii()返回8位描述的string,爲QByteArray,data()表示返回QByteArray的指針,QByteArray爲字節指針
//如今已改成toLatinl函數
Mat src
= imread(img_name.toLatin1().data());
cvtColor( src, src, CV_BGR2RGB );
QImage img
= QImage( (
const
unsigned
char
*)(src.data), src.cols, src.rows, QImage
:
:Format_RGB888 );
ui
-
>label
-
>setPixmap( QPixmap
:
:fromImage(img) );
img_name.clear();
}
能夠直接使用函數,打開磁盤上的圖片。
//打開攝像頭
void MainWindow
:
:on_pushButton_OpenCam_clicked()
{
int i
= ui
-
>comboCamera
-
>currentIndex();
//打開攝像頭,從攝像頭中獲取視頻
if(bCameraOpen)
{
videocapture
-
>release();
//kill camera first
}
videocapture
=
new VideoCapture(i);
bCameraOpen
=
true;
//這裏給出了一個很是大的分辨率,若是攝像頭沒有這麼大的分辨率,則會默認打開其支持的最大分辨率
videocapture
-
>set(CV_CAP_PROP_FRAME_WIDTH,
2592);
videocapture
-
>set(CV_CAP_PROP_FRAME_HEIGHT,
1944);
// 開始計時,超時則發出timeout()信號
timer
-
>start(
0);
}
攝像頭的打開也很是直接。
添加了一些修改,使用QT來作,真的是很是方便:github
項目地址:算法
https://github.com/jsxyhelu/GOQTTemplate3框架
歡迎提出寶貴意見。ide