opencv

一:欢迎伙伴们一起学习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);
	
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值