我是靠谱客的博主 落寞耳机,最近开发中收集的这篇文章主要介绍用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);		

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

最后

以上就是落寞耳机为你收集整理的用opencv生成色调饱和度图并显示,HSV空间转换为BGR空间的全部内容,希望文章能够帮你解决用opencv生成色调饱和度图并显示,HSV空间转换为BGR空间所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部