最近在学习颜色识别,openCV里颜色识别要用到HSV模型,但对HSV模型不熟悉,因此写了一个基于HSV的颜色展示小程序
在openCV里,H∈[0,179],S∈[0,255],V∈[0,255].不明白为什么H的取值范围这么少,这样在HSV2BGR的时候是会丢失一部分颜色的。
#define ROWS 256
#define COLS 180
for(k=0;k<256;k++){
for(j=0;j<ROWS;j++){
for(i=0;i<COLS;i++){
*(colorsrc.data+colorsrc.step[0]*j+colorsrc.step[1]*i)=i;
*(colorsrc.data+colorsrc.step[0]*j+1+colorsrc.step[1]*i)=j;
*(colorsrc.data+colorsrc.step[0]*j+2+colorsrc.step[1]*i)=k;
}
}
访问Mat的像素可以用
官方帮助文档给出的办法,以下是Mat储存二维数据方式
那data,step[0],step[1]指的是什么呢,data很容易看出来,是一个指向像素地址的指针。但如果要访问特定像素的地址,则需要用到step[0],step[1]
step[0]=列数*通道数,即图像一行含有多少个8位数据
step[1]=通道数
上面的方法是访问特定像素第一个通道的方法,如果要访问其他通道,则地址=+(通道-1)
//访问该像素的第三个通道
*(colorsrc.data+colorsrc.step[0]*j+colorsrc.step[1]*i)=k;
在生成图片之后,如果想把图片显示出来,要先把HSV转换成BGR才能显示。因为openCV默认以RGB显示图片
cvtColor(colorsrc,colordst,CV_HSV2RGB);
imshow("colordst",colordst);
最后,送上完整代码
#include "opencv2/opencv.hpp"
#include "iostream"
using namespace cv;
using namespace std;
#define ROWS 256
#define COLS 180
int main() {
Mat colorsrc=Mat(ROWS,COLS,CV_8UC3);
Mat colordst;
int i,j,k;
for(k=0;k<256;k++){
for(j=0;j<ROWS;j++){
for(i=0;i<COLS;i++){
*(colorsrc.data+colorsrc.step[0]*j+colorsrc.step[1]*i)=i;//访问某像素的第一个通道
*(colorsrc.data+colorsrc.step[0]*j+1+colorsrc.step[1]*i)=j;//第二个通道
*(colorsrc.data+colorsrc.step[0]*j+2+colorsrc.step[1]*i)=k;//第三个
}
}
cvtColor(colorsrc,colordst,CV_HSV2RGB);
imshow("colordst",colordst);
waitKey(100);
}
return 0;
}
运行截图