Showing posts with label OpenCV. Show all posts

Face recognition - Nhận dang khuôn mặt (P1)

1. Face detection
- Phát hiện khuôn mặt
- Không định danh được khuôn mặt đó là ai


Chỉ phát hiện ra có mặt người, không biết là ai


2. Face recognition


                     Xác định được người trong hình là Carie, Kate, Nicola, Jessica

+ Sau khi phát hiện ra khuôn mặt (face detection) thì nó sẽ xác định xem khuôn mặt phát hiện được là của ai

+ Để có thể biết được khuôn mặt trong hình là của ai thì trước đó phải training cho nó bằng tập ảnh gọi là data training (ảnh + ID (tên của người trong ảnh)). Quá trình training bao gồm
    - training image -> face detection -> face registration (đăng ký khuôn mặt + ID)
 
+ Khi chạy face recognition, từ một bức ảnh input chương trình sẽ lần lượt thực hiện các bước

    - Chạy Face detection để phát hiện face/mặt trong ảnh input
    - So sánh face trong ảnh input vừa phát hiện xem nó có giống với những face mà nó được training trước đó hay không từ đó đưa ra kết quả face đó là của ai trong tập nó đã được training hoặc không là của ai cả (không biết)

Tóm là thì Face recognition hoạt động y như con người vậy, phải được giới thiệu người đó là ai rồi sau đó gặp lại thì mới nhận ra được, tuy nhiên nhiều khi đã biết người đó rồi nhưng lần sau gặp lại thì không nhận ra được, cái đó phần mềm nó gọi là độ chính xác.

Độ chính xác phụ thuộc vào nhiều yếu tố:
- Thuật toán
- Tập ảnh traning ít hay nhiều, đủ góc cạnh mặt nhiều hay ít
- Chất lượng ảnh
- Xử lý trên ảnh trên không gian 2 chiều (ảnh thường), 3chiều (xác định thêm độ sâu, mô hình hóa face trên không gian 3 chiều kiểu như Face ID trên Iphone X của Apple)
- ...


3. Exam 

Face recognition bằng phần mềm OpenCV

https://github.com/eslinux/ImageProcessing/tree/master/OpenCV/15-Face-Recognition




Saturday, October 14, 2017

Lập trình OpenCV cơ bản


Học OpenCV thông qua các ví dụ:

http://opencvexamples.blogspot.com/p/learning-opencv-functions-step-by-step.html
Sunday, October 4, 2015
Tag :

Ứng dụng OpenCV Helloworld

1. OpenCV examples for host
Install GTK
yum install gtk2-devel

DisplayImage.cpp (using OpenCV-2.3.1)
 #include <stdio.h>  
 #include <opencv2/opencv.hpp>  
   
 using namespace cv;  
   
 int main(int argc, char** argv )  
 {  
   if ( argc != 2 )  
   {  
     printf("usage: DisplayImage.out <Image_Path>\n");  
     return -1;  
   }  
   
   Mat image;  
   image = imread( argv[1], 1 );  
   
   if ( !image.data )  
   {  
     printf("No image data \n");  
     return -1;  
   }  
   namedWindow("Display Image", CV_WINDOW_AUTOSIZE );  
   imshow("Display Image", image);  
   
   waitKey(0);  
   
   return 0;  
 }  
   


Build application
 export OPENCV_DIR=/home/usr/local
 export PATH=$PATH:${OPENCV_DIR}/bin  
 export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:${OPENCV_DIR}/lib/pkgconfig 
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${OPENCV_DIR}/lib  
   
 g++ `pkg-config --cflags opencv` `pkg-config --libs opencv` DisplayImage.cpp -o DisplayImage  
   

FromId3.jpg



Execute
 [ninhld@localhost ex]$   
 [ninhld@localhost ex]$ export OPENCV_DIR=/home/usr/local    
 [ninhld@localhost ex]$ export PATH=$PATH:${OPENCV_DIR}/bin  
 [ninhld@localhost ex]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${OPENCV_DIR}/lib  
 [ninhld@localhost ex]$     
 [ninhld@localhost ex]$ ./DisplayImage FromId3.jpg   
   

Kết quả


2. OpenCV examples for board 
Khi chạy trên host dùng GTK hoặc QT làm chương trình quản lý cửa sổ đều được.
Khi chạy trên board chỉ dùng được QT làm chương trình quản lý cửa sổ, GTK không được hỗ trợ trên các thiết bị nhúng.
Vì thế để chạy được các ví dụ dưới đây chúng ta cần có bộ thư viện QT được build sẵn cho board, xem các build tại đây.

- Tạo một QT project với một Button và một Label

- Mở file .pro và thêm hai dòng khai báo đến thư viện opencv đã installed
 INCLUDEPATH += /friendlyarm/include  
 LIBS +=/friendlyarm/lib/*.so  

- Tạo sự kiện cho button
  Right click on button > Go to slot ... > clicked( ) > OK

- 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:  
   explicit MainWindow(QWidget *parent = 0);  
   ~MainWindow();  
   
 protected:  
   IplImage*  imagerd; //declare imagerd as IplImage  
   
 private slots:  
   void on_OpenImage_clicked();  
   
 private:  
   Ui::MainWindow *ui;  
 };  
   
 #endif // MAINWINDOW_H  
   

- mainwindow.cpp
 #include "mainwindow.h"  
 #include "ui_mainwindow.h"  
   
 #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;  
 }  
   
 void MainWindow::on_OpenImage_clicked()  
 {  
   imagerd = cvLoadImage("FromId3.jpg");  
   
   QImage imageView = QImage((const unsigned char*)(imagerd->imageData),  
                imagerd->width,  
                imagerd->height,  
                QImage::Format_RGB888).rgbSwapped();  
   
   ui->myimage->setPixmap(QPixmap::fromImage(imageView));  
 }  
   

- Qmake and build
 $ export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin   
 $ export QMAKESPEC=/path/qt-everywhere-opensource-src-4.7.2/mkspecs/qws/linux-arm-g++   
 $ cd /home/ninhld/Documents/OpenCV_Helloworld  
 $ /friendlyarm/bin/qmake   
 $ make  

- Copy toàn bộ thư viện QT, OpenCV, chương trình OpenCV_Helloworld và file ảnh FromId3.jpg xuống board (sdcard or mount NFS)
- Trên terminal minicom export biến môi trường đến thư viện QT và OpenCV
 DEPEND_LIB_DIR=/friendlyarm  
 export CFLAGS=-I${DEPEND_LIB_DIR}/include   
 export CPPFLAGS=-I${DEPEND_LIB_DIR}/include   
 export LDFLAGS=-L${DEPEND_LIB_DIR}/lib   
 export PKG_CONFIG_PATH=${DEPEND_LIB_DIR}/lib/pkgconfig   
 export LD_LIBRARY_PATH=${DEPEND_LIB_DIR}/lib   
 export PATH=$PATH:${DEPEND_LIB_DIR}/bin:${DEPEND_LIB_DIR}/sbin  

- Chạy ví dụ
 $ ./OpenCV_Helloworld -qws  





Download chương trình tại đây.

Build OpenCV cho board nhúng FriendlyARM Mini2440

Download source code:
- OpenCV
- Examples

1. Build for host
OpenCV-2.0.0
  export PREFIX=/usr/local  
  ./configure --prefix=${PREFIX}  
     
  make    
  make install  

OpenCV-2.3.1
 cd OpenCV-2.3.1  
 mkdir release  
 cd release  
 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..  #chu y hai dau cham  
   
 make  
 make install  

2. Cross compile
OpenCV-2.0.0 (using configure)
 export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin  
 export CROSS=arm-none-linux-gnueabi-  
 export HOST=arm-none-linux-gnueabi  

 export PREFIX=/friendlyarm

 ./configure --prefix=${PREFIX} --host=${HOST} CC=${CROSS}gcc \
 --without-gtk --without-gthread --without-ffmpeg \
 --without-python --enable-shared

 make
 make install

OpenCV-2.3.1 (using cmake)
Sử dụng Qt GUI for cmake
 yum install cmake-gui  







 [ninhld@localhost ~]$ cd /home/ninhld/mini2440/opencv/OpenCV-2.3.1/release2  
 [ninhld@localhost release2]$   
 [ninhld@localhost release2]$   
 [ninhld@localhost release2]$   
 [ninhld@localhost release2]$ make  
 Scanning dependencies of target libjasper  
 [ 0%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jas_version.obj  
 [ 0%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jp2_enc.obj  
 [ 0%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jpc_tsfb.obj  
 [ 0%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jas_icc.obj  
 [ 0%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jp2_cod.obj  
 [ 0%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jas_stream.obj  
 [ 1%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jpc_t2dec.obj  
 [ 1%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jpc_t1dec.obj  
 [ 1%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jas_cm.obj  
 [ 1%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jpc_t2cod.obj  
 [ 1%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jpc_tagtree.obj  
 [ 1%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jpc_mct.obj  
 [ 2%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jpc_enc.obj  
 [ 2%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jas_iccdata.obj  
 [ 2%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jas_tmr.obj  
 [ 2%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jpc_mqenc.obj  
 [ 2%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jas_malloc.obj  
 [ 2%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jpc_mqcod.obj  
 [ 2%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jas_init.obj  
 [ 3%] Building C object 3rdparty/libjasper/CMakeFiles/libjasper.dir/jpc_mqdec.obj  
 ...  










Giới thiệu OpenCV


OpenCV: Thư viện xử lý ảnh được viết bằng C/C++ và hỗ trợ cả Linux và Windows.
Bản thân OpenCV chỉ chỉ đọc dữ liệu ảnh (file ảnh hoặc capture từ nguồn video)và xử lý trên buffer (RAM), muốn hiển thị được trên màn hình nó cần được kết hợp với các framework quản lý cửa sổ như GTK, QT, ...
Trong blog này OpenCV được kết hợp mới QT và chạy trên kit nhúng FriendlyARM mini2440.
Saturday, October 3, 2015
Tag :

- Copyright © Lập trình hệ thống nhúng Linux . Powered by Luong Duy Ninh -