本文來源電子發(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)用程序,
第二個小目標(biāo)是在主機上安裝OpenCV,并利用OpenCV調(diào)用攝像頭,然后是通過QT程序通過OpenCV實現(xiàn)調(diào)用攝像頭,并且通過QT直接在開發(fā)板上調(diào)式這個OpenCV調(diào)用攝像頭的應(yīng)用
第三個大目標(biāo)是將程序移植到開發(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擴(kuò)展插件,這個很重要,下載好插件后需要在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ā)板上進(jìn)行測試,如果你使用的是筆記本自帶的攝像頭,這個時候多多少少會有些問題,另外,最好先關(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; //獲取攝像頭當(dāng)前幀
};
#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安裝非常詳細(xì),可以參考,之后的具體開發(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)重新擴(kuò)展的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;//正在錄制標(biāo)志 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瀏覽量
3672 -
開發(fā)板試用
+關(guān)注
關(guān)注
3文章
301瀏覽量
2107
發(fā)布評論請先 登錄
相關(guān)推薦
評論