這篇文章主要講解了“Qt USB攝像頭解碼qcamera方法是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Qt USB攝像頭解碼qcamera方法是什么”吧!
成都創(chuàng)新互聯(lián)公司專業(yè)IDC數(shù)據(jù)服務(wù)器托管提供商,專業(yè)提供成都服務(wù)器托管,服務(wù)器租用,托管服務(wù)器,托管服務(wù)器,成都多線服務(wù)器托管等服務(wù)器托管服務(wù)。
除了監(jiān)控專用的攝像頭以外,有一些應(yīng)用場景用的還是USB攝像頭,甚至還有一些單片機或者開發(fā)板上用的CMOS攝像頭,而Qt在嵌入式領(lǐng)域應(yīng)用相當(dāng)廣,所以用Qt來讀取加載顯示USB攝像頭和CMOS攝像頭,也是非常多Qter做過的事情,qt本身就封裝了qcamera類,專用于本地攝像頭的讀取顯示,這個類主要是在windows系統(tǒng)和安卓系統(tǒng)比較好使,在嵌入式上歇菜,而且安卓上widget的qcamera也不好使,要用qml的camera才好使,所以開發(fā)人員很多時候,就是在找坑填坑,找到一種最佳的適中方案,比如我自己做過的一個手機app,需要調(diào)用手機的攝像頭,前置后置還要能切換,抓圖做一些處理,用的就是qml嵌入到widget,通過信號槽來通信。
用Qt來加載USB攝像頭解碼,主要就三種方案,一種是Qt自帶的,一種是ffmpeg來處理,一種是v4l2框架,每種方案都各自有優(yōu)缺點和對應(yīng)的應(yīng)用場景,比如Qt自帶的就非常適合windows下的只需要顯示攝像頭的場景,代碼簡單Qt內(nèi)置使用方便,如果是需要拿到每張圖片自己還要做分析處理比如人臉識別啥的,用ffmpeg是最好的,速度快資源占用低,可以自己GPU繪制,爽得很,如果是嵌入式linux的話,那用v4l2框架處理是最適合的,原生的通用api框架。
QCamera方案處理流程:
實例化QCamera對象,綁定stateChanged信號用于調(diào)整尺寸大小。
實例化QCameraViewfinder畫布,將QCamera對象設(shè)置畫布。默認采用類似句柄的形式顯示畫面,被系統(tǒng)接管繪制。
實例化QCameraImageCapture對象用來抓圖,如果有需要的話。
同時支持windows、linux、嵌入式linux上的USB攝像頭實時采集。
支持多路USB攝像頭多線程實時采集。
在嵌入式linux設(shè)備上,自動查找USB設(shè)備文件并加載。
可手動設(shè)置設(shè)備文件名稱,手動設(shè)置后按照手動設(shè)置的設(shè)備文件加載。
在嵌入式linux設(shè)備上支持人臉識別接口,實時繪制人臉框。
具有打開、暫停、繼續(xù)、關(guān)閉、截圖等常規(guī)功能。
可設(shè)置兩路OSD標(biāo)簽,分別設(shè)置文本、顏色、字號、位置等。
可作為視頻監(jiān)控系統(tǒng)使用。
//widget版本 static void getCameraInfo(QStringList &deviceNames, QStringList &descriptions) { #ifndef __arm__ #if (QT_VERSION > QT_VERSION_CHECK(5,5,0)) deviceNames.clear(); descriptions.clear(); QListcameras = QCameraInfo::availableCameras(); if (cameras.count() == 0) { qDebug() << TIMEMS << "not find USBCamera"; } else { foreach (QCameraInfo camera, cameras) { deviceNames << camera.deviceName(); descriptions << camera.description(); } } #endif #endif } void CameraThread::stateChanged() { #ifdef __arm__ #else #if (QT_VERSION > QT_VERSION_CHECK(5,5,0)) if (camera->state() == QCamera::ActiveState) { //輸出當(dāng)前設(shè)備支持的分辨率 QList sizes = camera->supportedViewfinderResolutions(); emit resolutions(sizes); //重新設(shè)置分辨率 QCameraViewfinderSettings set; set.setResolution(cameraWidth, cameraHeight); camera->setViewfinderSettings(set); } #endif #endif } bool CameraThread::init() { #ifdef __arm__ #else #if (QT_VERSION > QT_VERSION_CHECK(5,5,0)) QList cameras = QCameraInfo::availableCameras(); if (cameras.count() == 0) { qDebug() << TIMEMS << "not find USBCamera"; return false; } else { QWidget *frm = (QWidget *)parent(); camera = new QCamera(frm); connect(camera, SIGNAL(stateChanged(QCamera::State)), this, SLOT(stateChanged())); viewfinder = new QCameraViewfinder(frm); viewfinder->installEventFilter(this); camera->setViewfinder(viewfinder); QRect rect = frm->rect(); viewfinder->setAspectRatioMode(fillImage ? Qt::IgnoreAspectRatio : Qt::KeepAspectRatio); int offset = borderWidth * 1 + 0; viewfinder->setGeometry(offset / 2, offset / 2, rect.width() - offset, rect.height() - offset); viewfinder->setVisible(true); imageCapture = new QCameraImageCapture(camera); connect(imageCapture, SIGNAL(imageCaptured(int, QImage)), this, SLOT(displayImage(int, QImage))); return true; } #endif #endif } //qml版本 import QtQuick 2.0 import QtMultimedia 5.6 Item { signal receiveImage(); Video { id: video anchors.fill: parent //source: "rtsp://192.168.1.247:554/av0_0" source: "g:/mp4/1.mp4" MouseArea { anchors.fill: parent onClicked: { video.play() } } focus: true Keys.onSpacePressed: video.playbackState == MediaPlayer.PlayingState ? video.pause() : video.play() Keys.onLeftPressed: video.seek(video.position - 5000) Keys.onRightPressed: video.seek(video.position + 5000) } }
感謝各位的閱讀,以上就是“Qt USB攝像頭解碼qcamera方法是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Qt USB攝像頭解碼qcamera方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!