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。经过三重循环实现对数据的遍历。

相关文章
相关标签/搜索