本文來源電子發(fā)燒友社區(qū),作者:王志奇, 帖子地址:https://bbs.elecfans.com/jishu_2305273_1_1.html
之前測試搭建好了軟硬件開發(fā)環(huán)境后,我開始了項目開發(fā)嘗試,首先是調(diào)試了虛擬機Ubuntu的攝像頭獲取,然后利用QT程序調(diào)用攝像頭拍照,并嘗試在開發(fā)板上直接調(diào)試攝像頭調(diào)用程序,
第二個小目標是在主機上安裝OpenCV,并利用OpenCV調(diào)用攝像頭,然后是通過QT程序通過OpenCV實現(xiàn)調(diào)用攝像頭,并且通過QT直接在開發(fā)板上調(diào)式這個OpenCV調(diào)用攝像頭的應(yīng)用
第三個大目標是將程序移植到開發(fā)板并在開發(fā)板上測試,這一步由于我之前沒有完全解決opt下root目錄空間的問題,未能完全實現(xiàn),
并且在調(diào)試中發(fā)現(xiàn),我的主機和開發(fā)板用了不同的攝像頭出現(xiàn)了我還未能解決的問題。目前還在嘗試中。
本次項目測試在開發(fā)板上沒有完全實現(xiàn),主要是調(diào)試的root空間百分百被使用,把程序直接復(fù)制到開發(fā)板后由于攝像頭問題未能實現(xiàn),
但是,整個開發(fā)過程以及遇到的問題還是能起到一些避坑幫助的。
接下來,我將測試開發(fā)過程簡單介紹,并把一些問題記錄出來,
我在上一篇中,測試好了主機的開發(fā)環(huán)境,因為開發(fā)板提供的系統(tǒng)已經(jīng)完成了一些配置,只需要稍微測試程序調(diào)試即可,但是一定要注意在開發(fā)調(diào)試的時候,注意使用開發(fā)板root空間,不要將大的程序文件拷貝過去,會導(dǎo)致開發(fā)板端調(diào)試報錯的。
vmbox使用攝像頭的時候,需要在設(shè)置里面USB添加一個攝像頭篩選器,筆記本開發(fā)時候建議使用外接USB攝像頭,不建議使用筆記本自帶攝像頭開發(fā)測試,這會導(dǎo)致在開發(fā)板上測試使用攝像頭可能無法成功的問題。
另外,vmbox虛擬機需要安裝vbox官網(wǎng)的對應(yīng)版本的usb擴展插件,這個很重要,下載好插件后需要在vbox啟動后的上方菜單設(shè)備設(shè)置中添加設(shè)備控制增強插件,并且,在選擇USB控制器的時候要選擇2.0 和3.0
兩個選項輪流嘗試,并添加USB攝像頭,有的usb攝像頭雖然是2。0但USB選擇器需要選3.0才能被vbox虛擬機中的Ubuntu系統(tǒng)識別。
QT程序控制攝像頭開發(fā)程序在網(wǎng)上都有,比較簡單,創(chuàng)建新項目的時候注意選擇正確項目屬性如圖,一般Ubuntu系統(tǒng)設(shè)別了攝像頭,
QT代碼問題不大,在主機桌面測試后,可以選擇在ARM開發(fā)板上測試QT啟用攝像頭,你需要吧虛擬機識別的USB攝像頭插到開發(fā)板上進行測試,如果你使用的是筆記本自帶的攝像頭,這個時候多多少少會有些問題,另外,最好先關(guān)虛擬機再插拔攝像頭,我的系統(tǒng)奔潰了好幾次,耽誤了很多時間用于恢復(fù)虛擬機系統(tǒng),很不穩(wěn)定。
test.pro
QT += core gui
QT += multimedia
QT += multimediawidgets
greaterThan(QT_MAJOR_VERSION,
4): QT += widgets
TARGET
= QCameratest
TEMPLATE
= app
SOURCES
+= main.cpp
widget.cpp
FORMS += widget.ui
.h
#ifndef
WIDGET_H
#define
WIDGET_H
#include
class
QCamera;
class
QCameraViewfinder;
class
QCameraImageCapture;
class
Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private
slots:
void exitBtnResponded();
void cameraImageCaptured(int,QImage);
private:
QCamera* m_pCamera; //讀取攝像頭
QCameraViewfinder* m_pViewfinder; //渲染攝像頭
QCameraImageCapture* m_pImageCapture; //獲取攝像頭當前幀
};
#endif
// WIDGET_H
main.cpp
#include
"widget.h"
#include
int
main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
Widget.cpp
#include
"widget.h"
#include
#include
#include
#include
#include
#include
#include
Widget::Widget(QWidget
*parent)
: QWidget(parent)
{
setWindowTitle("QCamera");
m_pCamera = new QCamera(this);
m_pViewfinder = new
QCameraViewfinder(this);
m_pImageCapture = new
QCameraImageCapture(m_pCamera);
QPushButton* button1 = new
QPushButton("Capture");
QPushButton* button2 = new
QPushButton("Exit");
QVBoxLayout *mainLayout = new
QVBoxLayout(this);
mainLayout->addWidget(m_pViewfinder);
mainLayout->addWidget(button1);
mainLayout->addWidget(button2);
connect(button1, SIGNAL(clicked()),
m_pImageCapture, SLOT(capture()));
connect(button2, SIGNAL(clicked()), this,
SLOT(exitBtnResponded()));
connect(m_pImageCapture,
SIGNAL(imageCaptured(int,QImage)), this,
SLOT(cameraImageCaptured(int,QImage)));
m_pImageCapture->setCaptureDestination(QCameraImageCapture::CaptureToFile);
m_pCamera->setCaptureMode(QCamera::CaptureStillImage);
m_pCamera->setViewfinder(m_pViewfinder);
m_pCamera->start();
}
Widget::~Widget()
{
delete
m_pCamera;
delete
m_pViewfinder;
delete m_pImageCapture;
}
void
Widget::exitBtnResponded()
{
m_pCamera->stop();
close();
}
void
Widget::cameraImageCaptured(int, QImage image)
{
QString savepath =
QFileDialog::getSaveFileName(this,"Save
Capture","Capture","Image png(.png);;Image
jpg(.jpg);;Image bmp(*.bmp)");
if(!savepath.isEmpty()){
image.save(savepath);
}
第二部分是安裝OpenCV在Ubuntu上,并使用opencv調(diào)用攝像頭,
OpenCV安裝過程會不斷更新對應(yīng)的庫, 以及更新cmake
相關(guān),需要你給虛擬機再添加一個橋接到無線網(wǎng)卡的虛擬機網(wǎng)卡,如果,你使用的是網(wǎng)線與開發(fā)板調(diào)試的話。這樣就不需要來回切換了。
CSDN
上 有個叫不高興的
Ubuntu下QT 調(diào)用OpenCV使用攝像頭帖子中對于OpenCV安裝非常詳細,可以參考,之后的具體開發(fā)就參考思路即可。
其中,OpenCV安裝過程中要不斷注意報錯提示,安裝網(wǎng)絡(luò)上的步驟基本問題不大,少什么就裝什么,網(wǎng)絡(luò)暢通的話也就個把小時。
OpenCV安裝之后,有一件重要的事情就是升級QT,直接安裝QT5并設(shè)置環(huán)境變量,官方的Ubuntu 虛擬機中是QT4 ,這個開發(fā)的時候需要QT5,我使用的是OpenCV3, 已經(jīng)很古老了,但都需要QT5支持。
QT調(diào)用OpenCV開啟攝像頭的代碼放在文章最后,
我在實現(xiàn)qt調(diào)用OpenCV設(shè)別人臉的時候,Ubuntu崩潰了,開發(fā)板之前的root空間也又成了百分百占用了,我之前已經(jīng)重新擴展的etx4根空間了,但我發(fā)現(xiàn)我需要重新掛載一個新建的root空間,
另外就是,虛擬機以及硬盤所在
空間一定要留夠25G以上的空間,因為在安裝opencv相關(guān)時候,虛擬內(nèi)存和虛擬空間增長速度很快,盤滿了虛擬機Ubuntu系統(tǒng)容易崩潰導(dǎo)致重裝環(huán)境,刪除虛擬機重新連接虛擬硬盤無法繼續(xù)開發(fā)和測試,
目前,我正在解決重裝環(huán)境,等解決完,下一期我將著重在開發(fā)板上測試項目程序,實現(xiàn)最終項目。
這是找到一個比較好用的OpenCV編輯照片和調(diào)用攝像頭的代碼
optest.cpp
#include
#include
using
namespace cv;
using
namespace std;
int
main(int argc, char** argv)
{
CvPoint center;
double scale = -3;
IplImage* image =
cvLoadImage("lena.jpg");
argc == 2? cvLoadImage(argv[1]) : 0;
cvShowImage("Image", image);
if (!image) return -1; center = cvPoint(image->width / 2,
image->height / 2);
for (int i = 0;iheight;i++)
for (int j = 0;jwidth;j++) {
double dx = (double)(j - center.x) /
center.x;
double dy = (double)(i - center.y) /
center.y;
double weight = exp((dx*dx +
dy*dy)*scale);
uchar* ptr = &CV_IMAGE_ELEM(image,
uchar, i, j * 3);
ptr[0] = cvRound(ptr[0] * weight);
ptr[1] = cvRound(ptr[1] * weight);
ptr[2] = cvRound(ptr[2] * weight);
}
Mat src;Mat dst;
src = cvarrToMat(image);
cv::imwrite("test.png", src);
cvNamedWindow("test",1); imshow("test",
src);
cvWaitKey();
return
0;
}
g++ test.cpp -o testpkg-config --cflags--libs opencv
攝像頭使用代碼
#include
#include
#include
#include
using
namespace cv;
using
namespace std;
int
main()
{
//打開電腦攝像頭
VideoCapture cap(0);
if (!cap.isOpened())
{
cout << "error" <<
endl;
waitKey(0);
return 0;
}
//獲得cap的分辨率
int w =
static_cast(cap.get(CV_CAP_PROP_FRAME_WIDTH));
int h =
static_cast(cap.get(CV_CAP_PROP_FRAME_HEIGHT));
Size videoSize(w, h);
VideoWriter
writer("RecordVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25,
videoSize);
Mat frame;
int key;//記錄鍵盤按鍵
char startOrStop = 1;//0 開始錄制視頻; 1 結(jié)束錄制視頻
char flag = 0;//正在錄制標志 0-不在錄制; 1-正在錄制
while (1)
{
cap >> frame;
key = waitKey(100);
if (key == 32)//按下空格開始錄制、暫停錄制 可以來回切換
{
startOrStop = 1 - startOrStop;
if (startOrStop == 0)
{
flag = 1;
}
}
if (key == 27)//按下ESC退出整個程序,保存視頻文件到磁盤
{
break;
}
if (startOrStop == 0 && flag==1)
{
writer << frame;
cout << "recording"
<< endl;
}
else if (startOrStop == 1)
{
flag = 0;
cout << "end recording"
<< endl;
}
imshow("picture", frame);
}
cap.release();
writer.release();
destroyAllWindows();
return 0;
}
-
PHYTEC
+關(guān)注
關(guān)注
0文章
19瀏覽量
3704 -
開發(fā)板試用
+關(guān)注
關(guān)注
3文章
301瀏覽量
2194
發(fā)布評論請先 登錄
相關(guān)推薦
NXP首款搭載MPU的FRDM產(chǎn)品怎么樣?FRDM i.MX93開發(fā)板開箱速覽

恩智浦推出FRDM i.MX 93開發(fā)板
NXP推出FRDM i.MX 93開發(fā)板, 助力現(xiàn)代工業(yè)與邊緣智能開發(fā)

i.MX Linux開發(fā)實戰(zhàn)指南—基于野火i.MX系列開發(fā)板
使用TPS65219為i.MX 8M Plus供電

i.MX 8M Plus中的ISP圖像信號處理模塊特性概述
米爾基于NXP iMX.93開發(fā)板的M33處理器應(yīng)用開發(fā)筆記

【PHYTEC AM62x開發(fā)板試用】開箱
點擊參與米爾NXP i.MX 93開發(fā)板有獎試用

米爾NXP i.MX 93開發(fā)板的Qt開發(fā)指南

免費!NXP i.MX 93開發(fā)板有獎試用

評論