用opencv生成色调饱和度图并显示,HSV空间转换为BGR空间

纪念一下自己一下午用Opencv生成色调饱和度图并显示过程中踩的坑

基本思路:
(1)分别定义H,S,V
(2)对H,S,V分别填充数据
(3)将H,S,V合并成三通道图像HSV
(4)将图像HSV空间转换为BGR
(5)显示转换后的图像

代码:

#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
#define COLS 600
#define ROWS 600

int main()
{
	vector<Mat> myHSV(3);
	Mat HSV(ROWS, COLS, CV_8UC3);
	Mat BGR(ROWS, COLS, CV_8UC3);
	Mat H(ROWS, COLS, CV_8UC1);
	Mat S(ROWS, COLS, CV_8UC1);
	Mat V(ROWS, COLS, CV_8UC1);

	//分别生成H,S,V
	for (int i = 0; i < ROWS; i++)				//S    行数 饱和度
	{
		for (int j = 0; j < COLS; j++)			//H    列数 色调
		{
			H.data[i*ROWS + j] = unsigned char(j*(180.0 / COLS)); //这里更新H.data不能写H.data[i,j]
			S.data[i*ROWS+j] = unsigned char(255-i*(255.0/ROWS));
			V.data[i*ROWS+j] = unsigned char(255);	
		}
	}
	
	//合并H,S,V到三通道图HSV
	myHSV[0] = H;
	myHSV[1] = S;
	myHSV[2] = V;
	merge(myHSV, HSV);
	
	//将HSV转换成BGR空间,以便于显示
	cvtColor(HSV, BGR, CV_HSV2BGR);
	
	imshow("picture", BGR);
	waitKey(0);
	return 0;
}

遇到的坑
Mat.data指向Mat这个类的数据部分的开头,但是不能把它看成是一个二维数组。如果上述代码的数据生成部分写为

			H.data[i , j] = unsigned char(j*(180.0 / COLS)); 
			S.data[i , j] = unsigned char(255-i*(255.0/ROWS));
			V.data[i , j] = unsigned char(255);	

将会造成Mat.data只覆盖更新第一行,其他行保持初始数值不变,从而生成错误的色调饱和度图。
要把Mat.data看成一个向量而不是矩阵,这样更新操作写为

			H.data[i*ROWS + j] = unsigned char(j*(180.0 / COLS)); //这里更新H.data不能写H.data[i,j]
			S.data[i*ROWS+j] = unsigned char(255-i*(255.0/ROWS));
			V.data[i*ROWS+j] = unsigned char(255);		

就会生成正常的结果了,结果如下
色调饱和度图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值