本文來源電子發燒友社區,作者:王志奇, 帖子地址:https://bbs.elecfans.com/jishu_2305273_1_1.html
之前測試搭建好了軟硬件開發環境后,我開始了項目開發嘗試,首先是調試了虛擬機Ubuntu的攝像頭獲取,然后利用QT程序調用攝像頭拍照,并嘗試在開發板上直接調試攝像頭調用程序,
第二個小目標是在主機上安裝OpenCV,并利用OpenCV調用攝像頭,然后是通過QT程序通過OpenCV實現調用攝像頭,并且通過QT直接在開發板上調式這個OpenCV調用攝像頭的應用
第三個大目標是將程序移植到開發板并在開發板上測試,這一步由于我之前沒有完全解決opt下root目錄空間的問題,未能完全實現,
并且在調試中發現,我的主機和開發板用了不同的攝像頭出現了我還未能解決的問題。目前還在嘗試中。
本次項目測試在開發板上沒有完全實現,主要是調試的root空間百分百被使用,把程序直接復制到開發板后由于攝像頭問題未能實現,
但是,整個開發過程以及遇到的問題還是能起到一些避坑幫助的。
接下來,我將測試開發過程簡單介紹,并把一些問題記錄出來,
我在上一篇中,測試好了主機的開發環境,因為開發板提供的系統已經完成了一些配置,只需要稍微測試程序調試即可,但是一定要注意在開發調試的時候,注意使用開發板root空間,不要將大的程序文件拷貝過去,會導致開發板端調試報錯的。
vmbox使用攝像頭的時候,需要在設置里面USB添加一個攝像頭篩選器,筆記本開發時候建議使用外接USB攝像頭,不建議使用筆記本自帶攝像頭開發測試,這會導致在開發板上測試使用攝像頭可能無法成功的問題。
另外,vmbox虛擬機需要安裝vbox官網的對應版本的usb擴展插件,這個很重要,下載好插件后需要在vbox啟動后的上方菜單設備設置中添加設備控制增強插件,并且,在選擇USB控制器的時候要選擇2.0 和3.0
兩個選項輪流嘗試,并添加USB攝像頭,有的usb攝像頭雖然是2。0但USB選擇器需要選3.0才能被vbox虛擬機中的Ubuntu系統識別。
QT程序控制攝像頭開發程序在網上都有,比較簡單,創建新項目的時候注意選擇正確項目屬性如圖,一般Ubuntu系統設別了攝像頭,
QT代碼問題不大,在主機桌面測試后,可以選擇在ARM開發板上測試QT啟用攝像頭,你需要吧虛擬機識別的USB攝像頭插到開發板上進行測試,如果你使用的是筆記本自帶的攝像頭,這個時候多多少少會有些問題,另外,最好先關虛擬機再插拔攝像頭,我的系統奔潰了好幾次,耽誤了很多時間用于恢復虛擬機系統,很不穩定。
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調用攝像頭,
OpenCV安裝過程會不斷更新對應的庫, 以及更新cmake
相關,需要你給虛擬機再添加一個橋接到無線網卡的虛擬機網卡,如果,你使用的是網線與開發板調試的話。這樣就不需要來回切換了。
CSDN
上 有個叫不高興的
Ubuntu下QT 調用OpenCV使用攝像頭帖子中對于OpenCV安裝非常詳細,可以參考,之后的具體開發就參考思路即可。
其中,OpenCV安裝過程中要不斷注意報錯提示,安裝網絡上的步驟基本問題不大,少什么就裝什么,網絡暢通的話也就個把小時。
OpenCV安裝之后,有一件重要的事情就是升級QT,直接安裝QT5并設置環境變量,官方的Ubuntu 虛擬機中是QT4 ,這個開發的時候需要QT5,我使用的是OpenCV3, 已經很古老了,但都需要QT5支持。
QT調用OpenCV開啟攝像頭的代碼放在文章最后,
我在實現qt調用OpenCV設別人臉的時候,Ubuntu崩潰了,開發板之前的root空間也又成了百分百占用了,我之前已經重新擴展的etx4根空間了,但我發現我需要重新掛載一個新建的root空間,
另外就是,虛擬機以及硬盤所在
空間一定要留夠25G以上的空間,因為在安裝opencv相關時候,虛擬內存和虛擬空間增長速度很快,盤滿了虛擬機Ubuntu系統容易崩潰導致重裝環境,刪除虛擬機重新連接虛擬硬盤無法繼續開發和測試,
目前,我正在解決重裝環境,等解決完,下一期我將著重在開發板上測試項目程序,實現最終項目。
這是找到一個比較好用的OpenCV編輯照片和調用攝像頭的代碼
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 結束錄制視頻
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
+關注
關注
0文章
19瀏覽量
3796 -
開發板試用
+關注
關注
3文章
302瀏覽量
2389
發布評論請先 登錄
有獎丨米爾 NXP i.MX91開發板免費試用來啦

米爾NXP i.MX 91核心板發布,助力新一代入門級Linux應用開發
NXP i.MX 91開發板#支持快速創建基于Linux?的邊緣器件

NXP基于i.MX 91應用處理器打造的FRDM i.MX 91開發板特性參數詳解

NXP入門級Linux應用開發板,FRDM i.MX 91詳解

NXP i.MX 93 開發板#提供高效的機器學習 支持高能效的邊緣計算

NXP首款搭載MPU的FRDM產品怎么樣?FRDM i.MX93開發板開箱速覽

恩智浦推出FRDM i.MX 93開發板
NXP推出FRDM i.MX 93開發板, 助力現代工業與邊緣智能開發

評論