第二章 环境搭建
在Fedora9下安装OpenCV之前需要安装Cmake,这里我们安装采用Cmake2.8.6版本的(下载地址https://cmake.org/files/v2.8),OpenCV2.2.0(下载地址ftp://sourceforge.nchc.org.tw/o/op/opencvlibrary/opencv-unix/)。将OpenCV2.2.0分别编译成PC版和ARM版的,将编译完成后的ARM版lib文件部署到tiny4412对应的板上。此外,我们还需要编译qt5.3.2的PC版和ARM版,将编译好的ARM版库文件部署到tiny4412上。
2.1 编译并安装Cmake2.8.6
[root@localhost FRIENDLYARM]# tar xvzf cmake-2.8.6.tar.gz -C /usr/local/
[root@localhost FRIENDLYARM]# tar jxvf OpenCV-2.2.0.tar.bz2 -C /usr/local/
[root@localhost FRIENDLYARM]# cd /usr/local
[root@localhost local]# cd cmake-2.8.6
[root@localhost cmake-2.8.6]# ./configure
[root@localhost cmake-2.8.6]# make
[root@localhost cmake-2.8.6]# make install
2.2 编译并安装OpenCV2.2.0 for PC
[root@localhost cmake-2.8.6]# cd ../OpenCv-2.2.0
编译的东西放一个目录,防止和源文件换乱
[root@localhost OpenCv-2.2.0]# mkdir build_release
[root@localhost OpenCv-2.2.0]# cd build_release
2.2.1 安装PC版的OpenCV2.2.0
[root@localhost build_release]# cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_PYTHON_SUPPORT=ON ..
[root@localhost build_release]#make
[root@localhost build_release]#make install
2.2.2 添加库路径
[root@localhost build_release]# gedit /etc/ld.so.conf.d/opencv.conf
2.2.3 更新系统
[root@localhost build_release]# ldconfig
2.2.4 测试C例子
[root@localhost ~]# cd /usr/local/OpenCV-2.2.0/samples/c
[root@localhost c]# chmod +x build_all.sh
[root@localhost c]# ./build_all.sh
[root@localhost c]# ./facedetect --cascade="/usr/local/share/opencv/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 lena.jpg
成功会看到画面如图2-1所示:
图2-1 测试C成功画面
2.2.5 测试CPP例子
[root@localhost c]# cd /usr/local/OpenCV-2.2.0/samples/cpp
[root@localhost cpp]# g++ `pkg-config --cflags --libs opencv` drawing.cpp -o drawing
[root@localhost cpp]# ./drawing
成功会看到彩色画面如图2-2所示:
图2-2 测试CPP成功画面
2.3 编译并安装OpenCV2.2.0 for ARM
[root@localhost cmake-2.8.6]# cd ../OpenCv-2.2.0
编译的东西放一个目录,防止和源文件换乱
[root@localhost OpenCv-2.2.0]# mkdir opencv-arm
[root@localhost OpenCv-2.2.0]# cd opencv-arm
2.3.1 安装ARM版的OpenCV2.2.0
[root@localhost opencv-arm]#cmake -D CMAKE_SYSTEM_NAME=arm-linux -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-arm -D CMAKE_C_COMPILER=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc -D CMAKE_CXX_COMPILER=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-g++ -D CMAKE_EXE_LINKER_FLAGS="-lpthread -lrt" -D WITH_TIFF=OFF ..
[root@localhost opencv-arm]#make
[root@localhost opencv-arm]#make install
在/usr/local/opencv-arm下面会生成lib库。
2.4 安装Qt5.3.2 for PC
使用qt-opensource-linux-x86-5.3.2.run直接安装
[root@localhost opencv-arm]#cd /opt/
[root@localhost opt]#chmod +x qt-opensource-linux-x86-5.3.2.run
[root@localhost opt]#./qt-opensource-linux-x86-5.3.2.run
将其安装在/usr/local/pc-5.3.2目录下。
2.5 编译并安装Qt5.3.2 for arm
2.5.1 解压
[root@localhost /]#tar xvzf /opt/qt-everywhere-opensource-src-5.3.2.tar.gz -C /opt/arm-qte-5.3.2
2.5.2 修改配置文件qmake.config
[root@localhost /]#cd /opt/arm-qte-5.3.2/qt-everywhere-opensource-src-5.3.2/
qtbase/Mkspecs/linux-arm-gnueabi-g++
[root@localhost linux-arm-gnueabi-g++]vim qmake.conf
修改如下内容(红色):
#
# qmake configuration for building with arm-linux-gnueabi-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental gdb_dwarf_index
QMAKE_INCREMENTAL_STYLE = sublib
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv5te //由于我们用的是tiny4412
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv5te
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-gcc
QMAKE_CXX = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-g++
QMAKE_LINK = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-g++
# modifications to linux.conf
QMAKE_AR = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-objcopy QMAKE_NM = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-nm –P
QMAKE_STRIP = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-strip
load(qt_config)
2.5.3 配置
[root@localhost linux-arm-gnueabi-g++]#cd /opt/arm-qte-5.3.2/qt-everywhere
-opensource-src-5.3.2/
[root@localhost qt-everywhere-opensource-src-5.3.2]#./configure -opensource -xplatform linux-arm-gnueabi-g++ -prefix /usr/local/qte-5.3.2 -qt-libpng -no-opengl -no-sse2 -no-openssl -qt-zlib -no largefile -no-nis -no-cups -no-glib -no-iconv -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-separate-debug-info -nomake examples -nomake tools -no-c++11 -qt-freetype
在出现lisence 之后填yes。
2.5.4 安装arm版的qte-5.3.2
[root@localhost qt-everywhere-opensource-src-5.3.2]#make
大约经过5个小时的编译
[root@localhost qt-everywhere-opensource-src-5.3.2]#make install
最后qte-5.3.2在安装在目录/usr/local/qte-5.3.2下面
2.5.5 添加对tslib的支持
[root@localhost qt-everywhere-opensource-src-5.3.2]#cd /qtbase/src/plugins/
generic/tslib
[root@localhost tslib]#make
[root@localhost tslib]#make install
安装成功的界面如图2-3所示:
图2-3 arm版qte-5.3.2安装成功提示界面
最后会在/usr/local/qte-5.3.2/lib下面生成libqtslibplugin.so库文件
2.6 将OpenCV和Qt5.3.2部署到ARM上面来
将/usr/local/opencv-arm/lib文件拷贝到ARM上来,将/usr/local/qte-5.3.2的文件拷贝到ARM上面来。
第三章 Linux下利用PC自带的摄像头进行视频捕获App制作
3.1 程序功能分析
程序主要实现两个功能:采集界面和摄像头操作。程序主要包括几个功能函数:1、摄像头打开函数openCamera(),识别并打开摄像头。2、摄像头信息读取函数readFrame(),转化为QImage格式,并显示在界面上。3、拍照函数takingPicturing(),对捕获图像进行拍照。4、摄像头关闭函数closeCamera(),关闭摄像头,释放资源。其总体结构如图3-1所示:
图3-1 视频捕获APP总体结构图
3.2 程序设计
我们采用QtCreator编写程序,之前一直采用qt4.8.5版本,但现在换了qt5.3.2版本的,中途编译过程中出现了很多错误,主要是由于qy4到qt5版本头文件的位置发生变化而引起的,具体分析见附录部分。
首先在/home/yyz/下建立一个文件夹CameraApp
[root@localhost yyz]# mkdir CameraApp
3.2.1 界面设计
界面设计如图3-2所示:
图3-2 界面设计
3.2.2 主要程序设计
main.cpp内容:
#include <QApplication>
#include "cameraapp.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
CameraApp w;
w.show();
return a.exec();
}
cameraapp.h内容:
#ifndef CAMERAAPP_H
#define CAMERAAPP_H
#include <QWidget>
#include <QImage>
#include <QTimer>
#include <highgui.h>
#include <cv.h>
namespace Ui {
class CameraApp;
}
class CameraApp : public QWidget
{
Q_OBJECT
public:
explicit CameraApp(QWidget *parent = 0);
~CameraApp();
private slots:
void closeCamara();
void openCamara();
void readFarme();
void takingPictures();
private:
Ui::CameraApp *ui;
QTimer *timer;
QImage *imag;
CvCapture *cam;
IplImage *frame;
};
#endif // CAMERAAPP_H
cameraapp.cpp内容:
#include "cameraapp.h"
#include "ui_cameraapp.h"
CameraApp::CameraApp(QWidget *parent) :
QWidget(parent),
ui(new Ui::CameraApp)
{
ui->setupUi(this);
cam = NULL;
timer = new QTimer(this);
imag = new QImage();
connect(timer, SIGNAL(timeout()), this, SLOT(readFarme()));
connect(ui->open, SIGNAL(clicked()), this, SLOT(openCamara()));
connect(ui->pic, SIGNAL(clicked()), this, SLOT(takingPictures()));
connect(ui->closeCam, SIGNAL(clicked()), this, SLOT(closeCamara()));
}
//Open Camera
void CameraApp::openCamara()
{
cam = cvCreateCameraCapture(0);
timer->start(33);
}
//Read Farme
void CameraApp::readFarme()
{
frame = cvQueryFrame(cam);
QImage image=QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();
ui->label_1->setPixmap(QPixmap::fromImage(image));
}
//Take Pictures
void CameraApp::takingPictures()
{
frame = cvQueryFrame(cam);
QImage image=QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();
ui->label_2->setPixmap(QPixmap::fromImage(image));
}
//Close Camera
void CameraApp::closeCamara()
{
timer->stop();
cvReleaseCapture(&cam);
close();
}
CameraApp::~CameraApp()
{
delete ui;
}
3.3 调试及结果
[root@localhost yyz]#cd CameraApp
生成.pro文件:
[root@localhost CameraApp]#/usr/local/pc-5.3.2/bin/qmake -project
在.pro文件中添加库文件:
[root@localhost CameraApp]vi CameraApp.pro
加入如下内容:
INCLUDEPATH=/usr/local/include/opencv \
/usr/local/include/opencv2 \
/usr/local/include
LIBS +=/usr/local/lib/libopencv_highgui.so \
/usr/local/lib/libopencv_core.so \
/usr/local/lib/libopencv_imgproc.so \
/usr/local/lib/libopencv_ml.so
生成Makefile文件:
[root@localhost CameraApp]#/usr/local/pc-5.3.2/bin/qmake
编译,生成可执行文件:
[root@localhost CameraApp]#make
[root@localhost CameraApp]#./CameraApp
生成.pro文件:
[root@localhost CameraApp]#/usr/local/qte-5.3.2/bin/qmake -project
在.pro文件中添加库文件:
[root@localhost CameraApp]vi CameraApp.pro
加入如下内容:
INCLUDEPATH=/usr/local/include/opencv \
/usr/local/include/opencv2 \
/usr/local/include
LIBS +=/usr/local/opencv-arm/lib/libopencv_highgui.so \
/usr/local/opencv-arm/lib/libopencv_core.so \
/usr/local/opencv-arm/lib/libopencv_contrib.so \
/usr/local/opencv-arm/lib/libopencv_imgproc.so \
/usr/local/opencv-arm/lib/libopencv_ml.so
生成Makefile文件:
[root@localhost CameraApp]#/usr/local/qte-5.3.2/bin/qmake
编译,生成可执行文件(ARM板的):
[root@localhost CameraApp]#make
第四章 将制作的App移植到ARM开发板
将/home/yyz/CameraApp 目录下的 CameraApp 可执行文件拷贝到 SD 卡,然后将 SD 卡插到Tiny4412开发板上,执行以下命令将程序拷贝到tiny4412上:
@# cp /sdcard/CameraApp /bin
@# chmod +x CameraApp
然后运行 setqt4env 脚本执行以下命令运行我们的 Qt5.3.2 程序:
@# . setqt4env
@# ./CameraApp
得到画面如图4-2所示:
第五章 总结与体会
经过一个多星期不懈的努力,通过翻阅各种资料并寻求老师和同学们的帮助,我们小组终于完成了中星微USB摄像头驱动分析及视频捕获的任务。本文首先对USB摄像头驱动源码进行了详细的分析,包括初始化模块和卸载模块的分析,关键数据结构的分析以及上层软件接口功能模块和数据传输模块的具体介绍。然后,编译并安装OpenCV2.2.0和Qt5.3.2到PC机和ARM开发板上,将OpenCV和Qt5.3.2部署到ARM上面。接下来成功制作了Linux下利用PC自带的摄像头进行视频捕获的APP,最后将制作好的APP移植到ARM开发板上。
转眼间一个学期就结束了,让我感触最深的就是,李老师要求我们遇到问题首先一定要自己上网查找资料或者翻阅相关文献解决,而不是一味地寻求别人的帮助,研究生该掌握的是学习的方法,敢于挑战难度。在此次课程设计过程中,虽然遇到了不少的编译错误,但我们也在解决问题的过程中收获良多。该论文的完结为嵌入式这门课程的学习划上一个圆满的句号。
参考网站
[1]http://blog.csdn.net/yzysj123/article/details/38307825
[2]http://blog.chinaunix.net/uid-21410064-id-3049796.html
[3]http://blog.chinaunix.net/uid-23381466-id-3826748.html
[4]http://wenku.baidu.com/link?url=n-gYYd2vEjTzJvmZQdBtT0RVkJ5ZUWbHnf9FAtdhIntdg3fH
8g60bnnZqh5awMdITNAJ7OWyenT5gkJ8TPRNgMfA7Nawc0tjySnc6pQWYkS
[5]http://wenku.baidu.com/link?url=_Hc06M85Hz39sEvFNK2dHftxojr6_8z88vQbva3YVXTxCPg
FDj3mQuUK52fiX8qKWrlCjn5dcMKDALMWl_-NbgHaxlBTTkoCqD6qycALXJW
[6]http://blog.chinaunix.net/uid-22762900-id-4250152.html