2013年12月17日 星期二

Debian(Linux)下, 安裝 QT5 搭配 opencv 的流程



原由:

因為, 這學期有修習數位影像處理的課程,需要使用一套影像處理的函式庫, 來實習驗證上課老師 講的內容,以及交作業。 原本,懶惰的我想要以一套 BCB 打天下,在嘗試後發現 十幾年前 BCB 已經無法使用 opencv 2.x 版的函式庫了。雖然,還是可以在 opencv 1.x 下茍延殘喘。 但長遠看來,一直堅守在 BCB 不是長遠之路。無奈下,終於決定澈底拋棄 BCB, 尋找新的解決方案。

有鑑於,網路上的教學大多不完整,細節沒講清楚。常常就因為一個細節不清楚就卡住了,造成時間的浪費。 且網路上的教學,大多是針對 windows 平台的,少有針對 Debian (Linux)的教學。所以才想說,既然已經安裝完成了,就將過程紀錄下來,以供別人以及自已以後參考。

解決方案: Debain + QT5 + OpenCV

雖然小弟我個人,已經不用 windows 很久了。但是也不排除,使用到 windows 平台的可能性。況且作業,還是要交 windows 的版本, 所以開發軟體就選用跨平台,又不用錢的 QT5。

而小弟工作上使用的 OS 都是 Debian, 所以作業系統就是 Debian 了, 其它 linux 系統也是大同小異。

所以這次的組合就是 Debian + QT5 + OpenCV

流程 & 方法

  • 安裝  opencv
    先下載 opencv source code, 可以直接下載 source code tar ball, 也可以直接使用 git, 我是直接使用 git 的方式, 我個人覺得比較方便。
在你要放 opencv source code 的地方

  1. $git clone git://github.com/Itseez/opencv.git
    $cd opencv
    $git checkout 2.4
    $mkdir build
    $cd build 
設定 opencv 環境
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/opt/local ..
          編譯安裝
make && suod make install 

  •  安裝Qt5部份就不說明了,一直按 next 就對了
  •  Qt5 中,使用 opencv 的設定
  1. 將 opencv 的 pkgconfig 加入, pkg-config 的搜尋路徑(很多教學不是這步沒寫, 就是寫的不清不楚)
    在 rc 檔中加入 pkg-config 的路徑
    $vi ~/.bashrc
    最後面加入
    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
  2. 測試  pgk-config 有沒有設定成功
        $pkg-config opencv --cflags
        $pkg-config opencv --libs

  3. 使用Qt5建立一 console project
  4. 打開專案檔 .pro,加入 header file 及 libs 路徑

    INCLUDEPATH += /usr/local/include/opencv
    LIBS += `pkg-config opencv --cflags --libs`

5. 這樣就設定完成了

在使用 Debian + Qt5 + OpenCV 之前, 我的解決方案是用 debian + java + opencv 有空再來寫一寫










2013年6月19日 星期三

C 語言的 Bit Rotate

寫 C/C++ 的人, 應該都知道 bit shift 怎麼用。 如果想要將一個 Byte 的資料, 往左 shift 5 個位元, 很容易用以下程式碼就可以做到了。

int a = 45; // 45 = 二進位00101101
a = a << 5; // shift 後變成 10100000, 左邊的5個 bit 移出了, 右邊補進5個0
            // a 的值變成 160


但是有時候, 我們並不是要 bit shift, 而要 bit rotate。也就是說從 MSB shift 出去的 bit, 再從 LSM shift 回來。 
但 C/C++ 並沒有提供這種 bit rotate 的 bitwise operaton 操作, 但 bit rotate 在密碼學中常常用到, 因此在網路上找到 bit rotate 寫法, 並稍微修改了一下, 其實還滿簡單的, 以下的 code 就可以做到了。

unsigned char bit_rotate_left(int shift, unsigned char value)
{
   return (value << shift) | (value >> (sizeof(char)*8 - shift));
}



使用 45 (00101101) 向左 rotate 5 個 bit 的運作範例, 向右 rotate 也是如法炮制, 就不在特別說明了。