【正点原子Linux连载】第十八章 Camera 摘自【正点原子】I.MX6U嵌入式Qt开发指南V1.0.2
1)實(shí)驗(yàn)平臺(tái):正點(diǎn)原子阿爾法Linux開發(fā)板
2)平臺(tái)購買地址:https://item.taobao.com/item.htm?id=603672744434
3)全套實(shí)驗(yàn)源碼+手冊(cè)+視頻下載地址:http://www.openedv.com/thread-300792-1-1.html
4)對(duì)正點(diǎn)原子Linux感興趣的同學(xué)可以加群討論:935446741
第十八章 Camera
此章節(jié)例程適用于Ubuntu和正點(diǎn)原子I.MX6U開發(fā)板,不適用于Windows(需要自行修改才能適用Windows,Windows上的應(yīng)用不在我們討論范圍)!
19.1 資源簡介
正點(diǎn)原子I.MX6U開發(fā)板底板上有一路“CSI”攝像頭接口。支持正點(diǎn)原子的OV5640、OV2640和OV7725(不帶FIFO)。同時(shí)有USB接口,可以接USB免驅(qū)攝像頭。例程兼容USB攝像頭與正點(diǎn)原子的OV5640、OV2640和OV7725攝像頭。
出廠系統(tǒng)請(qǐng)更新到正點(diǎn)原子I.MX6U最新的出廠系統(tǒng),在驅(qū)動(dòng)層正點(diǎn)原子對(duì)OV5640、OV2640和OV7725攝像頭維護(hù)、優(yōu)化或者添加支持。
19.2 環(huán)境搭建
Qt里也有一個(gè)QCamera類。沒錯(cuò),確實(shí)可以使用這個(gè)QCamera類來開發(fā)攝像頭。但是這個(gè)類在正點(diǎn)原子的I.MX6U開發(fā)板4.1.15內(nèi)核版本上不能使用OV5640、OV2640和OV7725,可以使用USB免驅(qū)攝像頭。因?yàn)镺V5640、OV2640和OV7725的驅(qū)動(dòng)默認(rèn)是讀取YUYV格式數(shù)據(jù),而QCamera里讀取的數(shù)據(jù)是RGB格式數(shù)據(jù),它們可能數(shù)據(jù)對(duì)不上就無法使用了!但是也不建議修改驅(qū)動(dòng)的方法來使用QCamera,防止QCamera在某些方法上與驅(qū)動(dòng)層不對(duì)應(yīng),導(dǎo)致使用報(bào)錯(cuò)。
實(shí)際上我們使用V4l2編程就可以對(duì)攝像頭進(jìn)行編程,效果會(huì)比在Qt顯示流暢,因?yàn)閂4l2的數(shù)據(jù)直接可以顯示在fb0(也就是屏上)。而經(jīng)過Qt還需要在控件上處理,所以效率會(huì)慢一些!在正點(diǎn)原子I.MX6U開發(fā)板上或者說是嵌入式上,比較低性能的CPU對(duì)于處理圖像等大數(shù)據(jù)還是比較吃力的。所以我們需要去優(yōu)化,不同的編程方式,對(duì)數(shù)據(jù)的處理不同,寫出來的效果也會(huì)不同!
下面主要介紹Qt + OpenCV調(diào)用攝像頭,效果肯定不能與使用V4l2直接顯示在fb0上相比。在這個(gè)開發(fā)板的CPU上顯示效果還是比較好的,還能接受,流暢度一般。
要想在Ubuntu上使用OpenCV,那么我們的Ubuntu上必須有OpenCV的庫,如果您不想在Ubuntu安裝OpenCV,就可以跳過這小節(jié),直接用出廠系統(tǒng)提供的交叉編譯工具鏈,里面已經(jīng)提供有OpenCV。在Ubuntu上安裝OpenCV只是方便我們測試界面,編寫的程序也可以在Ubuntu上運(yùn)行。安裝的步驟也比較簡單。
正點(diǎn)原子I.MX6U出廠系統(tǒng)的OpenCV版本為3.1.0。也不一定非要與正點(diǎn)原子I.MX6U出廠系統(tǒng)里的OpenCV相同版本,我們只是在Ubuntu上運(yùn)行OpenCV。其中用到的API在3.1.0版本與3.4.1版本基本沒有什么區(qū)別。3.1.0版本的OpenCV與3.4.1版本的OpenCV絕大多數(shù)核心API都相同,不必要擔(dān)心找不到相同的API。
這里編者選擇安裝到OpenCV版本為3.4.1版本,因?yàn)?.1.0版本在配置cmake時(shí)下載的第三方庫因?yàn)榫W(wǎng)絡(luò)的原因難下載,導(dǎo)致cmake配置不過去。(PS:如果不是因?yàn)榫幾g不過去,編者會(huì)選擇與開發(fā)板相同的版本的OpenCV的)。
進(jìn)入OpenCV的官網(wǎng)https://opencv.org/releases。下載3.4.1版本的OpenCV,如下圖。我們選擇Sources(源碼)進(jìn)行下載。
右鍵選擇復(fù)制下載鏈接,用迅雷下載會(huì)比較快。下載完成后我們拷貝下載的文件到Ubuntu上進(jìn)行解壓?;蛘咧苯釉谡c(diǎn)原子的I.MX6U的光盤資料路徑下找到開發(fā)板光盤A-基礎(chǔ)資料/1、例程源碼/7、第三方庫源碼/opencv-3.4.1.tar.gz。然后拷貝到Ubuntu下。
如下圖我們已經(jīng)下載好文件,并拷貝下載好的文件到Ubuntu的家目錄下。
執(zhí)行下面的指令進(jìn)行解壓。解壓將會(huì)得到一個(gè)opencv-3.4.1文件夾,我們使用cd指令進(jìn)入此文件夾。
tar xf opencv-3.4.1.tar.gz cd opencv-3.4.1 安裝cmake,用于生成編譯OpenCV所需要的文件。 sudo apt-get install cmake 新建一個(gè)build目錄,并進(jìn)入,用于編譯生成的文件。 mkdir build cd build執(zhí)行cmake配置編譯。注意下面的指令“…”不要漏了!這里表示上一層目錄。cmake會(huì)從上一層目錄下找配置項(xiàng),并配置到當(dāng)前目錄。
cmake .. 在配置的過程中cmake會(huì)下載一些庫,如 ippicv_2017u3_lnx_intel64_general_20170822.tgz,需要一段時(shí)間,請(qǐng)等待,如果不能下載成功請(qǐng)重復(fù)嘗試。 cmake配置成功如下圖。執(zhí)行make開始編譯。輸入下面的指令。
make -j 16 // 以實(shí)際分配給虛擬機(jī)的核心數(shù)為準(zhǔn),最佳為分配給虛擬機(jī)核心數(shù)據(jù)的2倍。編者的虛擬機(jī)最大分配了16個(gè)核心,編者個(gè)人的電腦并不快,就是核心多,所以編譯就快。編譯完成耗時(shí)約5分鐘。不要只輸入make,否則將編譯很久!需要加參數(shù) -j n,n請(qǐng)根據(jù)個(gè)人虛擬機(jī)的實(shí)際情況。
19.3 應(yīng)用實(shí)例
請(qǐng)根據(jù)【正點(diǎn)原子】I.MX6U 出廠系統(tǒng)Qt交叉編譯環(huán)境搭建V1.x.pdf(x >= 6)的文檔搭建好I.MX6U的交叉編譯環(huán)境。交叉編譯工具鏈里已經(jīng)有OpenCV,所以我們只要在我們搭建的交叉環(huán)境下就可以調(diào)用OpenCV的相關(guān)API進(jìn)行編寫Qt項(xiàng)目了。
項(xiàng)目簡介:Qt加OpenCV打開攝像頭采集圖像并拍照。
例05_opencv_camera,Qt Camera編程(難度:較難)。項(xiàng)目路徑為Qt/3/05_opencv_camera。
用腳本打開Qt Creator,必須按出廠系統(tǒng)Qt交叉編譯環(huán)境搭建V1.x.pdf(x >= 6)的文檔搭建好交叉編譯環(huán)境,用腳本啟動(dòng)時(shí),腳本有相應(yīng)的環(huán)境變量,編譯時(shí)會(huì)用到。
05_opencv_camera.pro文件如下,添加以下內(nèi)容,這里主要是判斷交叉編譯器的類型,然后鏈接到不同的頭文件路徑與庫。
1 QT += core gui 2 3 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 4 5 CONFIG += c++11 6 7 # The following define makes your compiler emit warnings if you use 8 # any Qt feature that has been marked deprecated (the exact warnings 9 # depend on your compiler). Please consult the documentation of the 10 # deprecated API in order to know how to port your code away from it. 11 DEFINES += QT_DEPRECATED_WARNINGS 12 13 # You can also make your code fail to compile if it uses deprecated APIs. 14 # In order to do so, uncomment the following line. 15 # You can also select to disable deprecated APIs only up to a certain version of Qt. 16 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 17 18 TARGET_ARCH = $${QT_ARCH} 19 contains(TARGET_ARCH, arm){ 20 CONFIG += link_pkgconfig 21 PKGCONFIG += opencv 22 INCLUDEPATH += /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/include 23 } else { 24 LIBS += -L/usr/local/lib \ 25 -lopencv_core \ 26 -lopencv_highgui \ 27 -lopencv_imgproc \ 28 -lopencv_videoio \ 29 -lopencv_imgcodecs 30 31 #INCLUDEPATH可寫可不寫,系統(tǒng)會(huì)到找到此路徑 32 INCLUDEPATH += /usr/local/include 33 } 34 35 SOURCES += \ 36 camera.cpp \ 37 main.cpp \ 38 mainwindow.cpp 39 40 HEADERS += \ 41 camera.h \ 42 mainwindow.h 43 44 # Default rules for deployment. 45 qnx: target.path = /tmp/$${TARGET}/bin 46 else: unix:!android: target.path = /opt/$${TARGET}/bin 47 !isEmpty(target.path): INSTALLS += target第18行,獲取編譯器的類型。
第19行,判斷交叉編譯器的類型是否為arm。
第22行,arm對(duì)應(yīng)opencv的頭文件路徑,可以不寫,編譯不會(huì)報(bào)錯(cuò),但是我們想查看對(duì)應(yīng)的頭文件,就不得不包括這個(gè)路徑了,否則跳轉(zhuǎn)不過去!
第24~32行,添加庫的支持。-L后面指的是庫文件路徑,-l后面的是相關(guān)庫參數(shù)(l是大字母“L”的小寫字母“l(fā)”,不是一),如果不會(huì)寫庫的名稱,可以參考Ubuntu的OpenCV安裝路徑下的/usr/local/lib/pkgconfig/opencv.pc文件。
camera.h文件,此文件聲明了一個(gè)Camera類,其內(nèi)容如下,比較簡單。
camera.cpp類的定義如下。
9 #include "camera.h" 10 #include "opencv2/core/core.hpp" 11 #include "opencv2/highgui/highgui.hpp" 12 #include <QImage> 13 #include <QDebug> 14 15 Camera::Camera(QObject *parent) : 16 QObject(parent) 17 { 18 /* 實(shí)例化 */ 19 capture = new cv::VideoCapture(); 20 timer = new QTimer(this); 21 22 /* 信號(hào)槽連接 */ 23 connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeOut())); 24 } 25 26 Camera::~Camera() 27 { 28 delete capture; 29 capture = NULL; 30 } 31 32 void Camera::selectCameraDevice(int index) 33 { 34 /* 如果有其他攝像頭打開了,先釋放 */ 35 if (capture->isOpened()) { 36 capture->release(); 37 } 38 39 /* 打開攝像頭設(shè)備 */ 40 capture->open(index); 41 } 42 43 bool Camera::cameraProcess(bool bl) 44 { 45 if (bl) { 46 /* 為什么是33?1000/33約等于30幀,也就是一秒最多顯示30幀 */ 47 timer->start(33); 48 } else { 49 timer->stop(); 50 } 51 /* 返回?cái)z像頭的狀態(tài) */ 52 return capture->isOpened(); 53 } 54 55 void Camera::timerTimeOut() 56 { 57 /* 如果攝像頭沒有打開,停止定時(shí)器,返回 */ 58 if (!capture->isOpened()) { 59 timer->stop(); 60 return; 61 } 62 63 static cv::Mat frame; 64 *capture >> frame; 65 if (frame.cols) 66 /* 發(fā)送圖片信號(hào) */ 67 emit readyImage(matToQImage(frame)); 68 } 69 70 QImage Camera::matToQImage(const cv::Mat &img) 71 { 72 /* USB攝像頭和OV5640等都是RGB三通道,不考慮單/四通道攝像頭 */ 73 if(img.type() == CV_8UC3) { 74 /* 得到圖像的的首地址 */ 75 const uchar *pimg = (const uchar*)img.data; 76 77 /* 以img構(gòu)造圖片 */ 78 QImage qImage(pimg, img.cols, img.rows, img.step, 79 QImage::Format_RGB888); 80 81 /* 在不改變實(shí)際圖像數(shù)據(jù)的條件下,交換紅藍(lán)通道 */ 82 return qImage.rgbSwapped(); 83 } 84 85 /* 返回QImage */ 86 return QImage(); 87 } mainwindow.h頭文件代碼如下。 /******************************************************************Copyright ? Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.* @projectName 05_opencv_camera* @brief mainwindow.h* @author Deng Zhimao* @email 1252699831@qq.com* @net www.openedv.com* @date 2021-03-17*******************************************************************/ 1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 #include <QVBoxLayout> 6 #include <QHBoxLayout> 7 #include <QComboBox> 8 #include <QPushButton> 9 #include <QVBoxLayout> 10 #include <QLabel> 11 #include <QScrollArea> 12 #include <QDebug> 13 14 class Camera; 15 16 class MainWindow : public QMainWindow 17 { 18 Q_OBJECT 19 20 public: 21 MainWindow(QWidget *parent = nullptr); 22 ~MainWindow(); 23 24 private: 25 /* 主容器,Widget也可以當(dāng)作一種容器 */ 26 QWidget *mainWidget; 27 28 /* 滾動(dòng)區(qū)域,方便開發(fā)高分辨率 */ 29 QScrollArea *scrollArea; 30 31 /* 將采集到的圖像使用Widget顯示 */ 32 QLabel *displayLabel; 33 34 /* 界面右側(cè)區(qū)域布局 */ 35 QHBoxLayout *hboxLayout; 36 37 /* 界面右側(cè)區(qū)域布局 */ 38 QVBoxLayout *vboxLayout; 39 40 /* 界面右側(cè)區(qū)域容器 */ 41 QWidget *rightWidget; 42 43 /* 界面右側(cè)區(qū)域顯示拍照的圖片 */ 44 QLabel *photoLabel; 45 46 /* 界面右側(cè)區(qū)域攝像頭設(shè)備下拉選擇框 */ 47 QComboBox *comboBox; 48 49 /* 兩個(gè)按鈕,一個(gè)為拍照按鈕,另一個(gè)是開啟攝像頭按鈕 */ 50 QPushButton *pushButton[2]; 51 52 /* 拍照保存的照片 */ 53 QImage saveImage; 54 55 /* 攝像頭設(shè)備 */ 56 Camera *camera; 57 58 /* 布局初始化 */ 59 void layoutInit(); 60 61 /* 掃描是否存在攝像頭 */ 62 void scanCameraDevice(); 63 64 private slots: 65 /* 顯示圖像 */ 66 void showImage(const QImage&); 67 68 /* 設(shè)置按鈕文本 */ 69 void setButtonText(bool); 70 71 /* 保存照片到本地 */ 72 void saveImageToLocal(); 73 }; 74 #endif // MAINWINDOW_H mainwindow.cpp源文件代碼如下。 /******************************************************************Copyright ? Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.* @projectName 05_opencv_camera* @brief mainwindow.cpp* @author Deng Zhimao* @email 1252699831@qq.com* @net www.openedv.com* @date 2021-03-17*******************************************************************/ 1 #include "mainwindow.h" 2 #include <QGuiApplication> 3 #include <QScreen> 4 #include <QFile> 5 #include <QPixmap> 6 #include <QBuffer> 7 #include "camera.h" 8 9 MainWindow::MainWindow(QWidget *parent) 10 : QMainWindow(parent) 11 { 12 /* 布局初始化 */ 13 layoutInit(); 14 15 /* 掃描攝像頭 */ 16 scanCameraDevice(); 17 } 18 19 MainWindow::~MainWindow() 20 { 21 } 22 23 void MainWindow::layoutInit() 24 { 25 /* 獲取屏幕的分辨率,Qt官方建議使用這 26 * 種方法獲取屏幕分辨率,防上多屏設(shè)備導(dǎo)致對(duì)應(yīng)不上 27 * 注意,這是獲取整個(gè)桌面系統(tǒng)的分辨率 28 */ 29 QList <QScreen *> list_screen = QGuiApplication::screens(); 30 31 /* 如果是ARM平臺(tái),直接設(shè)置大小為屏幕的大小 */ 32 #if __arm__ 33 /* 重設(shè)大小 */ 34 this->resize(list_screen.at(0)->geometry().width(), 35 list_screen.at(0)->geometry().height()); 36 #else 37 /* 否則則設(shè)置主窗體大小為800x480 */ 38 this->resize(800, 480); 39 #endif 40 41 /* 實(shí)例化與布局,常規(guī)操作 */ 42 mainWidget = new QWidget(); 43 photoLabel = new QLabel(); 44 rightWidget = new QWidget(); 45 comboBox = new QComboBox(); 46 pushButton[0] = new QPushButton(); 47 pushButton[1] = new QPushButton(); 48 scrollArea = new QScrollArea(); 49 displayLabel = new QLabel(scrollArea); 50 vboxLayout = new QVBoxLayout(); 51 hboxLayout = new QHBoxLayout(); 52 53 vboxLayout->addWidget(photoLabel); 54 vboxLayout->addWidget(comboBox); 55 vboxLayout->addWidget(pushButton[0]); 56 vboxLayout->addWidget(pushButton[1]); 57 58 rightWidget->setLayout(vboxLayout); 59 60 hboxLayout->addWidget(scrollArea); 61 hboxLayout->addWidget(rightWidget); 62 mainWidget->setLayout(hboxLayout); 63 64 this->setCentralWidget(mainWidget); 65 66 pushButton[0]->setMaximumHeight(40); 67 pushButton[0]->setMaximumWidth(200); 68 69 pushButton[1]->setMaximumHeight(40); 70 pushButton[1]->setMaximumWidth(200); 71 72 comboBox->setMaximumHeight(40); 73 comboBox->setMaximumWidth(200); 74 photoLabel->setMaximumSize(100, 75); 75 scrollArea->setMinimumWidth(this->width() 76 - comboBox->width()); 77 78 /* 顯示圖像最大畫面為xx */ 79 displayLabel->setMinimumWidth(scrollArea->width() * 0.75); 80 displayLabel->setMinimumHeight(scrollArea->height() * 0.75); 81 scrollArea->setWidget(displayLabel); 82 83 /* 居中顯示 */ 84 scrollArea->setAlignment(Qt::AlignCenter); 85 86 /* 自動(dòng)拉伸 */ 87 photoLabel->setScaledContents(true); 88 displayLabel->setScaledContents(true); 89 90 /* 設(shè)置一些屬性 */ 91 pushButton[0]->setText("拍照"); 92 pushButton[0]->setEnabled(false); 93 pushButton[1]->setText("開始"); 94 pushButton[1]->setCheckable(true); 95 96 /* 攝像頭 */ 97 camera = new Camera(this); 98 99 /* 信號(hào)連接槽 */ 100 connect(camera, SIGNAL(readyImage(QImage)), 101 this, SLOT(showImage(QImage))); 102 connect(pushButton[1], SIGNAL(clicked(bool)), 103 camera, SLOT(cameraProcess(bool))); 104 connect(pushButton[1], SIGNAL(clicked(bool)), 105 this, SLOT(setButtonText(bool))); 106 connect(pushButton[0], SIGNAL(clicked()), 107 this, SLOT(saveImageToLocal())); 108 109 } 110 111 void MainWindow::scanCameraDevice() 112 { 113 /* 如果是Windows系統(tǒng),一般是攝像頭0 */ 114 #if win32 115 comboBox->addItem("windows攝像頭0"); 116 connect(comboBox, 117 SIGNAL(currentIndexChanged(int)), 118 camera, SLOT(selectCameraDevice(int))); 119 #else 120 /* QFile文件指向/dev/video0 */ 121 QFile file("/dev/video0"); 122 123 /* 如果文件存在 */ 124 if (file.exists()) 125 comboBox->addItem("video0"); 126 else { 127 displayLabel->setText("無攝像頭設(shè)備"); 128 return; 129 } 130 131 file.setFileName("/dev/video1"); 132 133 if (file.exists()) { 134 comboBox->addItem("video1"); 135 /* 開發(fā)板ov5640等設(shè)備是1 */ 136 comboBox->setCurrentIndex(1); 137 } 138 139 file.setFileName("/dev/video2"); 140 141 if (file.exists()) 142 /* 開發(fā)板USB攝像頭設(shè)備是2 */ 143 comboBox->addItem("video2"); 144 145 #if !__arm__ 146 /* ubuntu的USB攝像頭一般是0 */ 147 comboBox->setCurrentIndex(0); 148 #endif 149 150 connect(comboBox, 151 SIGNAL(currentIndexChanged(int)), 152 camera, SLOT(selectCameraDevice(int))); 153 #endif 154 } 155 156 void MainWindow::showImage(const QImage &image) 157 { 158 /* 顯示圖像 */ 159 displayLabel->setPixmap(QPixmap::fromImage(image)); 160 saveImage = image; 161 162 /* 判斷圖像是否為空,空則設(shè)置拍照按鈕不可用 */ 163 if (!saveImage.isNull()) 164 pushButton[0]->setEnabled(true); 165 else 166 pushButton[0]->setEnabled(false); 167 } 168 169 void MainWindow::setButtonText(bool bl) 170 { 171 if (bl) { 172 /* 設(shè)置攝像頭設(shè)備 */ 173 camera->selectCameraDevice(comboBox->currentIndex()); 174 pushButton[1]->setText("關(guān)閉"); 175 } else { 176 /* 若關(guān)閉了攝像頭則禁用拍照按鈕 */ 177 pushButton[0]->setEnabled(false); 178 pushButton[1]->setText("開始"); 179 } 180 } 181 182 void MainWindow::saveImageToLocal() 183 { 184 /* 判斷圖像是否為空 */ 185 if (!saveImage.isNull()) { 186 QString fileName = 187 QCoreApplication::applicationDirPath() + "/test.png"; 188 qDebug()<<"正在保存"<<fileName<<"圖片,請(qǐng)稍候..."<<endl; 189 190 /* save(arg1,arg2,arg3)重載函數(shù),arg1代表路徑文件名, 191 * arg2保存的類型,arg3代表保存的質(zhì)量等級(jí) */ 192 saveImage.save(fileName, "PNG", 1); 193 194 /* 設(shè)置拍照的圖像為顯示在photoLabel上 */ 195 photoLabel->setPixmap(QPixmap::fromImage(QImage(fileName))); 196 197 qDebug()<<"保存完成!"<<endl; 198 } 199 } 200 第111~154行,判斷l(xiāng)inux下的設(shè)備/dev/video*。細(xì)心的同學(xué)發(fā)現(xiàn),這個(gè)程序是Linux下用的。當(dāng)然Windows也是可以使用OpenCV的,需要自己修改pro文件鏈接到Windows的OpenCV庫-L需要修改為-LD,Windows下的庫文件是dll類型,此外不考慮macOS系統(tǒng),具體情況編者沒得實(shí)驗(yàn)。19.4 程序運(yùn)行效果
選擇合適的攝像頭設(shè)備,(注意如果在Ubuntu使用USB攝像頭,需要設(shè)置USB的兼容性為3.0反之2.0,具體需要看不同攝像頭設(shè)備,點(diǎn)擊連接攝像頭到虛擬機(jī)??梢韵仁褂肬buntu18.04自帶的茄子拍照軟件,檢測攝像頭是否可用)。點(diǎn)擊拍照,可以看程序輸出的Debug信息,保存照片的路徑為當(dāng)前可執(zhí)行程序的路徑,保存照片名稱為test.png,右上角顯示保存照片的縮略圖,再次點(diǎn)擊拍照則會(huì)替換已經(jīng)保存過的照片。若想要保存多個(gè)照片可自行設(shè)計(jì)。
若在正點(diǎn)原子I.MX6U開發(fā)板上運(yùn)行此程序,先插上攝像頭,確保攝像頭能用,注意不要選擇video0,video0是NXP的pxp驅(qū)動(dòng)產(chǎn)生的節(jié)點(diǎn),不是攝像頭,否則會(huì)報(bào)錯(cuò)。I.MX6U開發(fā)板是單核A7的CPU,性能有限,所以流暢度一般,還可以。但是在保存照片時(shí)會(huì)比PC電腦慢好多,不過也不能太勉強(qiáng)這個(gè)6ULL芯片了啦,能拍照已經(jīng)不錯(cuò)了,或者大家可以對(duì)保存照片步驟進(jìn)行優(yōu)化,開啟一個(gè)線程進(jìn)行優(yōu)化,剩下的交給大家了,大家可以的。
OpenCV在不設(shè)置攝像頭分辨率時(shí)會(huì)采用默認(rèn)分辨率640*480 30fps(絕大多數(shù)攝像頭都是支持這個(gè)分辨率)。USB免驅(qū)攝像頭可以使用下面的方法來設(shè)置分辨率。
總結(jié)
以上是生活随笔為你收集整理的【正点原子Linux连载】第十八章 Camera 摘自【正点原子】I.MX6U嵌入式Qt开发指南V1.0.2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【论文笔记】基于 VR 的移动机器人真实
- 下一篇: 全球规模最大天文馆上海天文馆18日正式开