1. Mục đích
Cài đặt và sử dụng thư viện OpenCV trên KIT FriendlyArm 2440. Bài viết này hướng dẫn:
- Cài đặt, cấu hình OpenCV trên KIT FriendlyARM 2440
- Viết ứng dụng Qt sử dụng thư viện OpenCV biên dịch chạy trên Linux host và trên KIT ARM Linux.
2. Yêu cầu
- PC cài đặt Ubuntu (10.4) dùng làm máy phát triển (Linux host)
- KIT FriendlyARM Mini/Macro2440 đã cài đặt Linux Embedded OS
- Compile source:
+ Trình biên dịch chéo arm-linux-gcc (4.3.3)
+ Mã nguồn OpenCV (Hướng dẫn này sử dụng phiên bản OpenCV 2.0.0 cho KIT ARM Linux)
3. Nội dung tiến hành
3.1. Cài đặt và cấu hình OpenCV trên KIT ARM Linux
Chú ý: Chuyển sang quyền root để thực hiện cài đặt
3.1.1. Download file OpenCV 2.0.0 tar.gz
http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.0/
- Giải nén, chứa trong thư mục OpenCV-2.0.0
3.1.2. Tạo thư mục chứa cài đặt OpenCV for ARM, để trong /opt
mkdir /opt/opencv.arm
3.1.3. Cấu hình OpenCV for ARM.
cd OpenCV-2.0.0
./configure --host=arm-linux --without-gtk --without-gthread --without-ffmpeg --without-python --enable-shared --prefix=/opt/opencv.arm
Description of the above command -
–host=arm-linux – This links ARM Linux GCC with OpenCV and cross-compiles the OpenCV codes for ARM target.
–without-gtk –without-gthread –without-ffmpeg –without-python – Here we remove the libraries we won’t be requiring on our target. Mainly to save space.
GTK is for GUI, Gthread is used for thread handling and management, ffmpeg is used for video. You can include these libraries if you need them.
3.1.4. Sau khi cấu hình thành công, thực hiện lệnh make
make
(tip: Sử dụng make –j4 hỗ trợ biên dịch multicore để biên dịch nhanh hơn)
3.1.5. Cài đặt với quyền root (sudo)
make install
Sau khi cài đặt thành công, thư mục cài đặt /opt/opencv.arm chứa 4 thư mục bin, include, lib, share. Thư mục lib chứa các files libcv.a, libcvaux.a,
libcxcore.a, libhighgui.a, libml.a, libcv.so.1.0.0, libcvaux.so.1.0.0, libcxcore.so.1.0.0, libhighgui.so.1.0.0, libml.so.1.0.0
3.1.6. Copy thư viện OpenCV lên KIT
KIT FriendlyARM Mini/Macro2440
OS : Qtopia
Kết nối, telnet vào KIT.
Kiểm tra thư mục /usr trên KIT, tạo 2 thư mục sau nếu chưa có.
mkdir /usr/include
mkdir /usr/lib
Sử dụng gFTP truyền các file thư viện OpenCV for Arm đã cài đặt xuống KIT
/opt/opencv.arm/include/opencv of host to /usr/include of target
/opt/opencv.arm/lib of host to /usr/lib of target
- Copy file libgomp.so.1 va libgomp.so.1.0.0 từ trong bộ cài arm-linux-gcc (Thư mục /opt/FriendlyArm/toolschain/4.4.3/bin/arm-none-linux-gnueabi/sys-root/lib)
xuống thư mục /usr/lib tren KIT. Thư viện này cho phép chạy các ứng dụng có hỗ trợ multicore
- Quá trình cài đặt OpenCV cho KIT hoàn tất.
3.2. Viết ứng dụng Qt sử dụng thư viện OpenCV
Mục đích:
- Demo thư viện OpenCV đã cài đặt bằng một ví dụ Qt đơn giản, cấu hình để ứng dụng biên dịch chạy trên máy tính Linux và trên KIT arm.
- Ứng dụng thực hiện khai báo (include) thư viện OpenCV và thử nghiệm gọi hàm mở file ảnh
3.2.1. Cấu hình ứng dụng chạy trên máy tính Linux
Trong file .pro thêm 2 dòng lệnh sau:
INCLUDEPATH += /usr/local/include/opencv
LIBS +=/usr/local/lib/*.so
Include thư viện trong file cần thiết:
#include <opencv/cv.h> //Thư viện chứa các hàm và thuật toán xử lý ảnh cơ bản + nâng cao
#include <opencv/highgui.h> //Thư viện chứa các hàm xử lý load/store images/video
Ví dụ gọi hàm đọc 1 file ảnh
- Cấu hình để biên dịch ứng dụng Qt chạy trên host Linux
3.2.2. Cấu hình ứng dụng chạy trên KIT arm
Trong file .pro thêm 2 dòng lệnh sau
INCLUDEPATH += /opt/opencv.arm/include/opencv
LIBS +=/opt/opencv.arm/lib/*.so
Include thư viện trong file cần thiết:
#include <cv.h> //Thư viện chứa các hàm và thuật toán xử lý ảnh cơ bản + nâng cao
#include <highgui.h> //Thư viện chứa các hàm xử lý load/store images/video
- Gọi các hàm xử lý của thư viện OpenCV cung cấp
- Cấu hình để biên dịch ứng dụng chạy trên KIT arm.
Ví dụ: Chương trình Qt sử dụng thư viện OpenCV (ShowImage)
1. Create a new Qt GUI Application project.
2. Add a new Label and Push Button in the form.
3. Do the rest with writing the program:
main.cpp:
#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <QFileDialog>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void changeEvent(QEvent *e);
QString FileOpName; //declare FileOpName as IplImage
IplImage* imagerd; //declare imagerd as IplImage
private slots:
void on_pushButton_clicked();
void openImage(); //add a new openImage function to the project
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QMessageBox>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <QPixmap>
#include <QString>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
//Open image function call
void MainWindow::openImage()
{
//declare FileOpName as the choosen opened file name
FileOpName = QFileDialog::getOpenFileName(this,
tr("Open File"), QDir::currentPath(),tr("Image Files (*.png *.jpg *.jpeg
*.bmp)"));
//Check if FileOpName exist or not
if (!FileOpName.isEmpty()) {
QImage image(FileOpName);
if (image.isNull()) {
QMessageBox::information(this, tr("Face Recognition"),
tr("Cannot load %1.").arg(FileOpName));
return;
}
}
//function to load the image whenever fName is not empty
if( FileOpName.size() ){
imagerd = cvLoadImage(FileOpName.toAscii().data());
QImage imageView = QImage((const unsigned char*)(imagerd->imageData),
imagerd->width, imagerd->height,QImage::Format_RGB888).rgbSwapped();
ui->label->setPixmap(QPixmap::fromImage(imageView));
}
}
void MainWindow::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void MainWindow::on_pushButton_clicked()
{
openImage();
}
Bạn có đam mê ngành thiết kế vi mạch và bạn muốn có mức lương 1000 usd cùng lúc bạn
đang muốn tìm một Trung tâm để học vậy hãy đến với ngành vi mạch tại SEMICON
HotLine: 0972 800 931 Ms Duyên