opencv core组件进阶

Posted chinwongleung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv core组件进阶相关的知识,希望对你有一定的参考价值。

1、图像在内存中存储方式,图像矩阵的大小取决于颜色模型,取决于所有的通道数;还有重要的颜色空间缩减的概念:因为如果是RGB的话,使用uchar的话,就有256^3的结合方法。所以要用到颜色缩减的方法,就是利用在每个像素值里抽选一部分像素值,而不是选择全部像素值。利用的公式是Inew=(Iold/10)*10来计算。

总结来看:就是对图像矩阵遍历每一个像素,然后对像素值进行公式运算。

2、LUT函数:Look up table操作,就是对于像素图像进行批量查找、扫描与操作图像。计时函数:getTickCount()和getTickFrequency()函数。

3、访问图像中像素的三类方法,参照opencv蓝皮书的111页,(colorReduce()函数的三种写法:(这个是用来减少颜色空间的函数)

//这种做法是第一种做法用指针来做。
void colorReauce(Mat& inputImage, Mat& outputImage, int div)
{
    outputImage = inputImage.clone();//这个是将图片复制;
    int rowNumber = outputImage.rows;//
    int colNumber = outputImage.cols*outputImage.channels();这个是找出每列中元素的个数,找出通道中的个数,参照那个图片颜色空间的通道数目。灰度图是通道数为1,彩色图是通道数为3;
    for (int i = 0; i < rowNumber; i++)
    {
        uchar* data = outputImage.ptr<uchar>(i);//获取第i行的首地址;
        for (int j = 0; j < colNumber; j++)
        {
            data[j] = data[j] / div*div + div / 2;//处理每个像素 ;
        }
    }
}

 

第一种是用指针的方法访问元素;

第二种做法是用迭代器来处理像素;类似与STL库中的迭代器;

第三种做法是用动态地址来计算,就是将蓝色、红色和绿色来进行分别测量;(image.at<vec3b>(j, i)[channe]=value;tips:注意这个通道的顺序是BGR,不是RGB)

4、ROI区域图像叠加&图像混合

感兴趣区域:ROI(这个是简化工作工程的图片区域,是从图像中选择一个图像区域中)

定义这个区域有两种方法:(1)使用矩形区域Rect(2)指定感兴趣行或列的范围(Range)Range是指从起始索引到终止索引,

(1)Mat imageROI;

Mat imageROI = image(Rect(500,250,logo.cols,logo.rows));//这个是定义ROI区域的

(2)imageROI = image(Range(250,250+logoImage.rows),Range(200,200+logoIamge.cols));

5、addWeighted()函数 (计算数组加权和)double alpha、double beta和 double gamma这个分别代表数组的权重。参照ROI蓝皮书的118页的代码;

(tips:两幅图片一定要同样的类型和尺寸,因为我们做的是两张图片的加权,两张图片不相同不能运算)

6、初级图像混合:addWeighted函数,参照前面的代码(https://blog.csdn.net/poem_qianmo/article/details/20911629

addWeighted的矩阵表达式是:dst = src1[I]*alpha+ src2[I]*beta + gamma;

7、分离颜色通道、多通道图像混合;通过split和merge方法来进行。

(1)通道分离:split()函数,是一个多通道数组分离几个单通道数组;

split函数:void split(const Mat& src, Mat *mvbegin);

                void split(InputArray m, OutputArrayOfArrays mv);

公式:mv[c](I)=src(I)c

8、输入XML和YAML文件

xml和YAML文件是用来做数据的存储和传输用的,我们训练玩的特征点数据是存储在这里的。

 

以上是关于opencv core组件进阶的主要内容,如果未能解决你的问题,请参考以下文章

Web应用的组件化进阶篇

图像识别——《OpenCV3编程入门-毛星云》第二部分 初探core组件

OpenCV3编程入门读书笔记2-core组件

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

opencv进阶-YOLO对象检测的代码解读

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情