人學習一是任務,二是興趣。原本本科畢業,學校淮陰師範學院,估計大家都沒聽過,在學校就對圖像很感興趣,但是咱們這屆圖形學沒有開,因此一直就擱置下來了。幹着一份餬口的工做,看不到一點但願,人也頹廢了,但是學習老是好的,這就開始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。經過三重循環實現對數據的遍歷。