一:欢迎伙伴们一起学习opencv
1.本人从事软件开发2年,做过两三个像样的项目,并全部投入了市场使用;
2.本人在软件开发领域主要从事是基于C++ Qt进行PC端,ARM LINUX环境下的软件开发;
3.本人深知目前道行才刚刚入门,要想在该行业扎根,需有颗学无止境的心,故周末都坚持进行学习提升;
4. 本人在学习oencv阶段,会将个人见解,学习体会发布出来,主要还是给后续自己看的;
5. 本人发布的文章如果能帮助部分伙伴,那也将是件让自己愉快的事情,故如果有伙伴对我发布的opencv篇章有疑问,可私信我;
6. 因本人学习opencv是在初级阶段,故不会对opencv文章进行过多的描述;
7. 自己对所有出现的API理解,都写在了代码片段的注释中;
8. 后续本人进入opencv的高级阶段,甚至是从业者,会对当前发布的文章进行归纳,知识点补充;
9. 欢迎同道中人探讨,如果有前辈能指教一二,此乃本人有幸也。
二:色彩空间转换
1.通过cv::imread()接口读取图像数据;
2.通过cv::cvtColor()接口对原始数据进行转换;
三:效果图
四:代码片段
1.main.cpp
#include <iostream>
#include <opencv.hpp>
#include "ColorSpaceTransitoin.h"
using namespace std;
using namespace cv;
int main(int argc, const char *argv[])
{
/* @function :imread()
* @brief :从给定图像文件中加载图像
* @param :图像文件路径
* @param :加载的方式 参见枚举类型cv::ImreadModes
* @return :Mat对象
* @note : 1. 如果图像不能读取(缺少文件,权限不当,不支持或无效的格式),这个函数将返回空的Mat(Mat::data == null)
* 2. 支持的格式:bmp,dib,jpeg,jpg,jpe,jp2,png,webp,pbm,pgm,ppm,pxm,pnm,sr,ras,tiff,tif,exr,pic;
* 3. 该函数是根据内容来决定图像的类型,而非文件扩展名
* 4. 对于彩色图像,解码后图像的存储通道为**B G B**
* 5. 当使用cv::ImreadModes::IMREAD_GRAYSCALE,将使用解码器进行灰度转换
* 6. 结果可能与cv::cvtColor()的输出不同
* 7. 在Linux,BSD或其他unix的开源操作系统上,opencv寻找系统提供的编解码器。需安装相应的软件包
* 8.具体详细参考源码注释
**/
/* @class : 1.Mat类表示单通道或多通道的N维数组阵列;
* : 2.它由两部分组成,一个矩阵头(矩阵大小,存储的方法,存储地址)和一个指向包含了像素值的矩阵指针;
* : 3.矩阵头部大小是恒定的,然而矩阵本身的大小因图像的不同而不同,通常是较大的数量级;
* : 4.该类使用引用计数系统,每个Mat对象都有自己的头,然而其矩阵数据的指针可能指向同一个地址,这取决于Mat对象之间是否进行的赋值运算;
*
* @member : int flag;
* - 关于矩阵的信息
* - Mat的标识
* - 数据是否连续
* - 深度
* - 通道数目
* int dims;
* - 数组的维度,取值大于等于2
* int rows,clos;
* - 行,列数量,如果矩阵超过2维,那么这两个值为-1
* uchar* data;
* - 数据指针
* ......
* @function :Mat();
* - 无参构造 矩阵大小由图像数据而定
* Mat(int rows, int cols, int type);
* - @param rows 二维数组的行
* - @param clos 二维数组的列
* - @param type 矩阵的类型 CV_8UC1,...CV64C4 1-4通道矩阵
* Mat(Size size, int type);
* - @param size 构造给定Size(clos,rows)大小的Mat,在该构造函数中,行数与列数相反
* - @param type 矩阵的类型 CV_8UC1,...CV64C4 1-4通道矩阵
* ......
**/
Mat tRawMat = imread("../../Images/lena.jpg");
if (tRawMat.data == NULL)
return -2;
//显示图像
imshow("BGR",tRawMat);
//将原图转换为Gray图像
Mat tGrayMat;
ColorSpaceTransitoin::getInstance()->bgr2Gray(tRawMat, tGrayMat); //自定义的额C++单例懒汉类
//显示图像
imshow("GRAY", tGrayMat);
//将原图转换为HSV H-色调度 S-饱和度 V-亮度 参见HSV颜色模型
Mat tHsvMat;
ColorSpaceTransitoin::getInstance()->bgr2Hsv(tRawMat, tHsvMat);
//显示图像
imshow("HSV", tHsvMat);
//阻塞窗体
waitKey();
//销毁单例对象
ColorSpaceTransitoin::release();
//销毁3个窗口
destroyWindow("BRG");
destroyWindow("GRAY");
destroyWindow("HSV");
return 0;
}
2.ColorSpaceTransitoin.h (自定义色彩空间转换c++单例类)
#pragma once
#include <opencv.hpp>
#include "ColorTransitionBash.h"
using namespace cv;
/* @class : ColorSpaceTransitoin
* @note : 色彩空间转换类 采用opencv API
*/
class ColorSpaceTransitoin : public ColorTransitionBash<ColorSpaceTransitoin>
{
ColorSpaceTransitoin();
~ColorSpaceTransitoin();
friend ColorTransitionBash;
public:
void bgr2Gray(const Mat &rawMat,Mat &nowMat); //BGR Mat / Gray Mat
void bgr2Hsv(const Mat &rawMat, Mat &nowMat); //BGR Mat / HSV Mat
};
3.ColorSpaceTransitoin.cpp (自定义色彩空间转换c++单例类)
#include "ColorSpaceTransitoin.h"
ColorSpaceTransitoin::ColorSpaceTransitoin()
{
}
ColorSpaceTransitoin::~ColorSpaceTransitoin()
{
}
void ColorSpaceTransitoin::bgr2Gray(const Mat & rawMat, Mat & nowMat)
{
cvtColor(rawMat, nowMat,COLOR_BGR2GRAY,2);
}
void ColorSpaceTransitoin::bgr2Hsv(const Mat & rawMat, Mat & nowMat)
{
/*@function : cvtColor()
*@brief : 将图像从一个颜色空间转换为另一个颜色空间
*@param : 原Mat
*@param : 目标Mat
*param : 转换的类型enum类型 参见cv::ColorConversionCodes
*@param : 通道数 默认为0 由输入图像和颜色转换码决定
*/
cvtColor(rawMat, nowMat, COLOR_BGR2HSV);
}