openCV安裝

       人學習一是任務,二是興趣。原本本科畢業,學校淮陰師範學院,估計大家都沒聽過,在學校就對圖像很感興趣,但是咱們這屆圖形學沒有開,因此一直就擱置下來了。幹着一份餬口的工做,看不到一點但願,人也頹廢了,但是學習老是好的,這就開始openCV的學習。html

       我在大學的時候也編譯過幾個版本的openCV,1.0.0,2.2.0,1.0.0版本可能太舊了,在編譯2.2.0時出現各類問題,也沒編譯成功,昨天去官網http://opencv.org/downloads.html看,穩定版已經到2.4.9,感受時間過得真快,下載下來編譯,沒有任何問題,代碼優化的很多,在編譯前面版本的時候相關的依賴庫都裝過了,因此也沒出現依賴的問題。ios

       編譯是按官方的文檔編譯的,個人系統是ubuntu14.04。ubuntu

       cd xxx/opencv數組

       mkdir release學習

       cd release優化

       cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..ui

       makespa

       sudo make installcode

       安裝目錄在/usr/local下。htm

       在學校一直使用qt,在qtcreator中使用引入opencv。能夠經過右鍵工程添加庫,或者直接在.pro文件中加入

INCLUDEPATH += /usr/local/include \
                /usr/local/include/opencv \
                /usr/local/include/opencv2

LIBS += /usr/local/lib/libopencv_highgui.so \
        /usr/local/lib/libopencv_core.so    \
        /usr/local/lib/libopencv_imgproc.so

下面我新建了個C++工程來試試。

代碼以下

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>

using namespace cv;

int main()
{
    IplImage *_iplImage = NULL;
    int _nHeight = 0;
    int _nWidth = 0;
    int _nChannels = 0;
    int _nStep = 0;
    uchar* _pucharData = NULL;
    _iplImage = cvLoadImage("fruits.jpg");
    if (_iplImage == NULL)
    {
        std::cout << "OPEN IMAGE FILE ERROR!" << std::endl;
        return -1;
    }
    _nHeight = _iplImage->height;
    _nWidth = _iplImage->width;
    _nChannels = _iplImage->nChannels;
    _nStep = _iplImage->widthStep;
    _pucharData = (uchar*)(_iplImage->imageData);

    std::cout << "Height: " << _nHeight << " Width: " << _nWidth
              << " Channels: " << _nChannels << std::endl;

    cvNamedWindow("MainWindow");
    cvMoveWindow("MainWindow", 100 , 100);

    for (int _i = 0; _i < _nHeight; ++_i)
    {
        for (int _j = 0; _j < _nWidth; ++_j)
        {
            for (int _k = 0; _k < _nChannels; ++_k)
            {
                _pucharData[_i * _nStep + _j * _nChannels + _k] =
                        255 - _pucharData[_i * _nStep + _j * _nChannels + _k];
            }
        }
    }

    cvShowImage("MainWindow", _iplImage);

    waitKey(0);

    cvReleaseImage(&_iplImage);
    cvDestroyWindow("MainWindow");


    return 0;
}

例子說這個功能是將圖片的顏色反轉。結果以下

這個是原圖

不過效果蠻好看

重要的是這段代碼

 for (int _i = 0; _i < _nHeight; ++_i)
    {
        for (int _j = 0; _j < _nWidth; ++_j)
        {
            for (int _k = 0; _k < _nChannels; ++_k)
            {
                _pucharData[_i * _nStep + _j * _nChannels + _k] =
                        255 - _pucharData[_i * _nStep + _j * _nChannels + _k];
            }
        }
    }


爲何這麼寫和IplImage保存的圖片有關係。

這是個3通道也就是nChannels的圖片也就是rgb圖片,其保存是這樣的BGRBGRBGR...,一維數組形式,其中一個參數widthStep,就是一行數據佔多少字節,這樣經過高和寬就能定位到圖片中的任何一個地方,當成二維數組來操做。

_i * _nStep + _j * _nChannels定位到每一個像素的開始,而後_k值遍歷每一個顏色值即RGB。經過三重循環實現對數據的遍歷。

相關文章
相關標籤/搜索