2013年12月24日 星期二

OpenCV: Color-space conversion

since: 2013/12/23
update: 2013/12/24

reference:
1. Amazon.com: Practical OpenCV eBook
2. Welcome to opencv documentation!
3. I touchs: Using OpenCV on Mac OS X

A. 前置作業:
     1. 先依照 I touchs: Using OpenCV on Mac OS X 的說明, 建置好開發環境.

     2. 需要加入到專案的 OpenCV 函式庫爲: (Add Files to Project...)
          libopencv_core.dylib
          libopencv_highgui.dylib
          libopencv_imgproc.dylib

     3. 將 main.cpp 的 main function 更名.(不作為程式執行的進入點)
          //int main(int argc, const char * argv[])  
          int main_main(int argc, const char * argv[])

     4. 爲專案新增 C++ 檔案:      
         點選專案 > New File... > OS X > C and C++ > C++ Class > Next >
         Save as: colorSpaceConversion.cpp > Create

----------------------------------------------------------------------------------------

B. 撰寫程式:
     1. 開啓 colorSpaceConversion.h 檔案, 修改如下:
#ifndef __HelloOpenCV__colorSpaceConversion__
#define __HelloOpenCV__colorSpaceConversion__

#include <iostream>

//@add
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#endif /* defined(__HelloOpenCV__colorSpaceConversion__) */

---------------------------------------------------------------------------------


     2. 開啓 colorSpaceConversion.cpp 檔案, 修改如下:
#include "colorSpaceConversion.h"

//@add
using namespace std;
using namespace cv;


// Global variables
const int slider_max = 100; // slider 最大的數值
int slider; // slider 目前的數值
double alpha; // 加權數(0.0 ~ 1.0)
double beta;  // 加權數(0.0 ~ 1.0)

// Matrices to store images
Mat img_source; // 原始照片
Mat img_converted; // 存放色彩轉換後的照片
Mat img_destination; // 存放二張照片加權後所合成的照片

// Callback function for trackbar event
void on_trackbar(int pos, void *)
{
    // case 1 與 case 2: 擇一執行
    printf("slider position: %d \n", slider);
   
    // case 1: RGB to GRAY
    if (pos > 0) {
        // 將 RGB 的照片: img_source, 轉換成灰階並存入 img_converted 中
        cvtColor(img_source, img_converted, CV_RGB2GRAY);
    }
    else {
        img_converted = img_source;
    }
   
    // 顯示照片
    imshow("Trackbar app", img_converted);
   
    /*************************************************************/
   
    /*
    // case 2: RGB to BGR
    // 將 RGB 的照片: img_source, 轉換成 BGR 並存入 img_converted 中
    cvtColor(img_source, img_converted, CV_RGB2BGR);

    alpha = (double)slider/slider_max; // 加權數(0.0 ~ 1.0)
    beta = (1.0 - alpha); // 加權數(0.0 ~ 1.0)
   
    // 計算各別(照片)矩陣的加權值 (img_source x beta) + (img_converted) x alpha ,
    // 存入 img_destination 中, 並且各別的照片必須要有相同的大小(size)與類型(type)
    // p.s. 不可使用 RGB(3個 channel) 與 灰階(1個 channel) 來作加權計算.

    addWeighted(img_source, beta, img_converted, alpha, 0.0, img_destination);
    
    // 顯示照片
    imshow("Trackbar app", img_destination);
    */
}

int main()
{
    // Read image
    //img_source = imread("/Lanli/RD/Projects/OpenCV_Mac/HelloOpenCV/pipi.png", CV_LOAD_IMAGE_COLOR);
    //img_source = imread("/Lanli/RD/Projects/OpenCV_Mac/HelloOpenCV/pipi.png", CV_LOAD_IMAGE_GRAYSCALE);

    img_source = imread("/Lanli/RD/Projects/OpenCV_Mac/HelloOpenCV/pipi.png");
   
    // check if image was loaded
    if( !img_source.data ) {
        printf("Error loading img_source \n");
        return -1;
    }
   
    // Initialize values
    slider = 0;
   
    // Create Windows
    //namedWindow("Trackbar app", WINDOW_AUTOSIZE);
    //namedWindow("Trackbar app", WINDOW_NORMAL);

    namedWindow("Trackbar app");
   
    // Create Trackbars
    char TrackbarName[50];
    sprintf(TrackbarName, "TrackBar Max: %d", slider_max);
    createTrackbar(TrackbarName, "Trackbar app", &slider, slider_max, on_trackbar);
 
    // Show some stuff
    on_trackbar(slider, 0);
   
    // Wait until user press 'q'
    //
    // 回圈: 等待 1 微秒(以作業系統的最小時間爲下限)來偵測鍵盤事件,
    // 如果不是按下 'q', 就一直偵測下去.
    // p.s. 至少要有一個 HighGUI 的視窗存在且啟用, 才會有作用

    while(char(waitKey(1)) != 'q') {
    }
   
    // destroys all of the opened HighGUI windows.
    destroyAllWindows();
   
    return 0;
}


----------------------------------------------------------------------------------------

C. 執行結果:
     1. RGB to GRAY:
         slider position: 0


       
         slider position: 50

     2. RGB to BGR:
         slider position: 75

         slider position: 100

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。