概述
纪念一下自己一下午用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空间所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复