人学习一是任务,二是兴趣。本来本科毕业,学校淮阴师范学院,估计你们都没听过,在学校就对图像很感兴趣,可是我们这届图形学没有开,所以一直就搁置下来了。干着一份糊口的工作,看不到一点希望,人也颓废了,可是学习总是好的,这就开始openCV的学习。
我在大学的时候也编译过几个版本的openCV,1.0.0,2.2.0,1.0.0版本可能太旧了,在编译2.2.0时出现各种问题,也没编译成功,昨天去官网http://opencv.org/downloads.html看,稳定版已经到2.4.9,感觉时间过得真快,下载下来编译,没有任何问题,代码优化的不少,在编译前面版本的时候相关的依赖库都装过了,所以也没出现依赖的问题。
编译是按官方的文档编译的,我的系统是ubuntu14.04。
cd xxx/opencv
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make
sudo make install
安装目录在/usr/local下。
在学校一直使用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。通过三重循环实现对数据的遍历。