我试图获取图像的H,S和V值,所以我将RGB图像转换为HSV,然后只是询问所需的值,然后打印它们。我不太确定我做对了,因为当打印值(hsV的V)时,我得到100+的值,我明白V只是0到100,也许我没有使用正确的方法,这里是代码:
#include "opencv/highgui.h"
#include "opencv/cv.h"
#include <cstdlib>
#include <iostream>
#include <stdio.h>
using namespace std;
int main(int argc, char** argv) {
int i=0,total=0;
IplImage* img = cvLoadImage( argv[1] );
IplImage* hsv;
CvSize size;
int key = 0, depth;
size = cvGetSize(img);
depth = img->depth;
hsv = cvCreateImage(size, depth, 3);
cvCvtColor( img, hsv, CV_BGR2HSV );
for(i=0;i<480;i++){ //asking for the values in \ form (1,1)(2,2),...(480,480)
CvScalar s;
s = cvGet2D(hsv,i,i);
printf("s=%f\n,s.val[2]); //s.val[2] equals to hs**V** right?
}
cvReleaseImage(&img);
cvReleaseImage(&val);
return 0;
}
答案 0 :(得分:1)
这里的另一个答案是正确的,但这里是一个代码片段,我必须在opencv中计算V通道。我从Gimp app获得了值,这个函数给了我opencv值。
//Max values: App HSV H=360 S=100 V=100 OpenCV H=180 S=255 V=255
double newHSV(double value)
{
//new_val = value * opencv_max_range / other_app_max_range
double newValue = value * 255 / 100;
return newValue;
}
要在Gimp等其他应用程序中检查opencv HSV值,只需将公式计算为:
gimp_value = opencv_value * other_app_max_range / opencv_max_range
答案 1 :(得分:0)
你这样做的方式是正确的。只是价值观有点不同。
H理想情况下应该是0-360。但由于一个字节只能容纳0-255,因此H值减半。所以范围是0-180。
V和S使用0-255的整个范围来指定值和饱和度。