人学习一是任务,二是兴趣。原本本科毕业,学校淮阴师范学院,估计大家都没听过,在学校就对图像很感兴趣,但是咱们这届图形学没有开,因此一直就搁置下来了。干着一份糊口的工做,看不到一点但愿,人也颓废了,但是学习老是好的,这就开始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。经过三重循环实现对数据的遍历。