真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

QtUSB攝像頭解碼qcamera方法是什么

這篇文章主要講解了“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方案處理流程:

  1. 實例化QCamera對象,綁定stateChanged信號用于調(diào)整尺寸大小。

  2. 實例化QCameraViewfinder畫布,將QCamera對象設(shè)置畫布。默認采用類似句柄的形式顯示畫面,被系統(tǒng)接管繪制。

  3. 實例化QCameraImageCapture對象用來抓圖,如果有需要的話。

二、功能特點

  1. 同時支持windows、linux、嵌入式linux上的USB攝像頭實時采集。

  2. 支持多路USB攝像頭多線程實時采集。

  3. 在嵌入式linux設(shè)備上,自動查找USB設(shè)備文件并加載。

  4. 可手動設(shè)置設(shè)備文件名稱,手動設(shè)置后按照手動設(shè)置的設(shè)備文件加載。

  5. 在嵌入式linux設(shè)備上支持人臉識別接口,實時繪制人臉框。

  6. 具有打開、暫停、繼續(xù)、關(guān)閉、截圖等常規(guī)功能。

  7. 可設(shè)置兩路OSD標(biāo)簽,分別設(shè)置文本、顏色、字號、位置等。

  8. 可作為視頻監(jiān)控系統(tǒng)使用。

三、效果圖

Qt USB攝像頭解碼qcamera方法是什么

四、核心代碼

//widget版本
static void getCameraInfo(QStringList &deviceNames, QStringList &descriptions)
{
#ifndef __arm__
#if (QT_VERSION > QT_VERSION_CHECK(5,5,0))
    deviceNames.clear();
    descriptions.clear();
    QList cameras = 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)注!


分享標(biāo)題:QtUSB攝像頭解碼qcamera方法是什么
文章來源:http://weahome.cn/article/gigssp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部