openCV安装

       人学习一是任务,二是兴趣。本来本科毕业,学校淮阴师范学院,估计你们都没听过,在学校就对图像很感兴趣,可是我们这届图形学没有开,所以一直就搁置下来了。干着一份糊口的工作,看不到一点希望,人也颓废了,可是学习总是好的,这就开始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。通过三重循环实现对数据的遍历。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值