2012年8月13日 星期一

在 Linux 中,用 Eclipse 開發 OpenCV 程式

在 Linux 中使用 OpenCV 這套函式庫時,通常查到的資料都是 gcc 的指令型式。對初學者而言,不容易除錯,也沒有熟悉的 GUI 介面。想用 Eclipse 來開發 OpenCV 的程式,卻屢試不成。其實,只要在開發專案的內容加上設定就可以了。

1. 安裝 OpenCV 開發套件

要開發 OpenCV 的程式,要先在 Linux 裏安裝相關套件
[root@Celeron-D ~]# yum install opencv-devel opencv-devel-docs
其中的 "opencv-devel" 是 OpenCV 的函式庫及標頭檔,"opencv-devel-docs" 是它的開發文件。

2. 建立新專案

參考“在 Fedora 中,用 Eclipse 寫第一個程式 HelloWorld”一文,開建立新專案。

3. 撰寫程式、下載測試影像

從 " The USC-SIPI Image Database " 或 " Professor Eli Turkel" 下載測試圖片(別的來源也 OK),要放在工作區 (workspace) 中。提供測試的 OpenCV 範例程式如下,請剪貼、覆蓋在 HelloWorld.c 上。
/* =============================================================
 Name        : FirstProject.c (Histogram_Eq.c)
 Author      : SiB Chang
 Version     : 1.0
 Copyright   : GPLv3
 Description : "Histogram Equalization" in C, Eclipse, and Linux
 ============================================================= */

#include <cv.h>
#include <highgui.h>
#include <stdio.h>

#define IPL_DEPTH_8U 8

int main( )
{
  IplImage *InImage;
  IplImage *TmpImage;
  IplImage *RedImage, *GreenImage, *BlueImage; // Red Green Blue
  IplImage *HueImage, *SatImage; // Hue   Saturation
  IplImage *ValImage, *LumImage; // Value Lightness (Luminance)

  InImage    = cvLoadImage( "../tooDark.jpg", 1);
  TmpImage   = cvCreateImage( cvGetSize(InImage), IPL_DEPTH_8U, 3);
  RedImage   = cvCreateImage( cvGetSize(InImage), IPL_DEPTH_8U, 1);
  GreenImage = cvCreateImage( cvGetSize(InImage), IPL_DEPTH_8U, 1);
  BlueImage  = cvCreateImage( cvGetSize(InImage), IPL_DEPTH_8U, 1);

  // 2: V of HSV processed only,
  // 1: L of HLS processed only,
  // 0: RGB processed separately (bad, color changed)
  switch( 2 ){
    case 2:
      cvCvtColor( InImage, TmpImage, CV_RGB2HSV );  // Change RGB to HSV
      HueImage = RedImage;  SatImage = GreenImage;  ValImage = BlueImage;
      cvSplit( TmpImage, HueImage, SatImage, ValImage, 0); // Split into H,S,V
      cvEqualizeHist( ValImage, ValImage );                // Equalize V image
      cvMerge(HueImage, SatImage, ValImage, 0, TmpImage);  // Merge H,S,V
      cvCvtColor( TmpImage, TmpImage, CV_HSV2RGB );  // Change HSV to RGB
      break;

    case 1:
      cvCvtColor( InImage, TmpImage, CV_RGB2HLS );  // Change RGB to HLS
      HueImage = RedImage;  LumImage = GreenImage;  SatImage = BlueImage;
      cvSplit( TmpImage, HueImage, LumImage, SatImage, 0); // Split into H,L,S
      cvEqualizeHist( LumImage, LumImage );                // Equalize L image
      cvMerge(HueImage, LumImage, SatImage, 0, TmpImage);  // Merge H,L,S
      cvCvtColor( TmpImage, TmpImage, CV_HLS2RGB );  // Change HLS to RGB
      break;

    default:
      cvSplit(InImage, RedImage, GreenImage, BlueImage,0); // Split into R,G,B
      cvEqualizeHist( RedImage,   RedImage);               // Equalize R image
      cvEqualizeHist( GreenImage, GreenImage);             // Equalize G image
      cvEqualizeHist( BlueImage,  BlueImage);              // Equalize B image
      cvMerge( RedImage,GreenImage,BlueImage,0,TmpImage); // Merge R,G,B
  }

  cvNamedWindow("tooDark.jpg", 1);
  cvShowImage  ("tooDark.jpg", InImage);
  cvNamedWindow("Equalized tooDark.jpg", 1);
  cvShowImage  ("Equalized tooDark.jpg", TmpImage);
  cvWaitKey(0);
  return 0;
}
注意:上面的程式共提供三種 Histogram Equalization (直方圖等化) 的方法,有好有壞自己試試看,改變程式中 switch( 2 ) 括號內的數字就可以。

4. 設定專案參數

從「選單」→「專案(P)」點選「內容(P)」,以設定專案的內容
當跳出專案設定視窗後,從左欄的「C/C++ Build」點選「Settings」,接著再設定右欄 Settings。在右欄中的「Configuration:」選 "[All Configurations]",使「除錯版」與「釋出版」有相同設定。設定標頭檔的引入路徑要從「Tool Settings」→「GCC C Compiler」點選「Includes」。
注意:上面的「Configuration:」設定中若「除錯版」與「釋出版」的設定要求不同時,就要分開設定。

點選在「Include paths (-I)」右方的 『+』圖示,以加入 OpenCV 的路徑,不同版本的安裝路徑可能不同,可利用「File system...」這個按鈕方便尋找,在本系統是 /usr/include/opencv
最後要設定 Link (鏈結) 的參數,一樣從「Tool Settings」→「GCC C Linker」點選「Libraries」,再按「Libraries (-l)」右方的 『+』圖示,加入 "cv"、"cxcore"、"highgui" 三個 (要分三次加入)。
按確定後,完成專案設定。

5. 編譯、執行

按「鐵鎚」選定「釋出版」模式,再按一次「鐵鎚圖示」就會進行「編譯」,如果出現「警告訊息」致編譯未完成,再按一次「鐵鎚圖示」就可以了。接著按「執行」鈕,開始執行程式。
左邊的相片是處理前,右邊是處理後。

已測試版本:

  • Fedora: 14
  • Eclipse: 3.6.1
  • OpenCV: 2.1.0

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)