在opencv, c++中转换bgr为hsv
convert bgr to hsv in opencv, C++
我正在尝试用网络摄像头在BGR中拍摄某人的面部照片,将图片转换为HSV,并分析这些HSV值,这些值将在稍后的皮肤检测算法中使用。不幸的是,这张照片似乎在BGR中进行了分析,即使在我尝试使用cvtColor()转换它之后。
我使用下面的代码来测试我是否使用了正确的颜色空间。注意我尝试将饱和度和值设置为0的部分:
Mat faceROI = findFace(first); //basic Mat, region of interest for face (code not included)
Mat temp;
faceROI.convertTo(temp, CV_8UC3); //making sure this has right no. of channels and such
CvScalar s;
IplImage face_ipl = temp; //new header
IplImage* aNew = cvCreateImage(cvGetSize(&face_ipl), face_ipl.depth, 3);
cvCvtColor(&face_ipl, aNew, CV_BGR2HSV);
for(int x = 0; x < faceROI.cols; x++){
for (int y = 0; y < faceROI.rows; y++){
s = cvGet2D(aNew, x, y);
//vvvvvvvvvvv
s.val[1] = 0; //should be saturation
s.val[2] = 0; //should be value
//^^^^^^^^^^^
cvSet2D(aNew, x, y, s);
}
}
Mat again(aNew); //<--- is this where something is set back to BGR?
imshow("white", again);
cvReleaseImage(&aNew);
这产生了我的脸的一个完全蓝色的图片,所以看起来我正在编辑一个BGR图像的G和R通道,而不是HSV图像的S和V通道。(我想把图片贴出来,但这是我的第一个帖子,所以我还没有足够的声誉。)
有人知道为什么会这样吗?
您将c++ Mat样式与旧的C IplImage*混合在一起,这使得看到究竟发生了什么感到困惑。以下是将inputImage
转换为HSV的代码:
Mat fullImageHSV;
cvtColor(inputImage, fullImageHSV, CV_BGR2HSV);
请注意,OpenCV的HSV值是从0-180的H,而S和V是从0-255的,而其他程序倾向于使用不同的值。另外请注意,OpenCV无法正常显示HSV图像,这会扭曲颜色,因为它们被解释为RGB。
相关文章:
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 将 BGR 图像转换为 jpeg 格式的 base64 字符串
- 在Qt C++中绘制HSV色轮
- OpenCV 如何创建 HSV 格式垫
- 从OpenCV中的三个单个垫子创建BGR垫
- 比较BGR图像是否完全相同
- 将 BGR OpenCV 垫映射到特征张量
- 将HSV转换为RGB在OpenCV中失败
- 如何确定 BMP 图像是否包含来自标题的 BGR 或 BGRA 像素
- 在 opencv 中使用 Color_YUV2BGR 从 YUV 到 BGR 的错误转换
- 实时图像处理:HSV图像中的噪声(openCV)
- (C语言)将RGB转换为HSV和HSV的算法在两者的范围为0-255范围内
- 将HSV值分配给特定像素
- 使用Inrange后,从HSV转换为BGR或OPENCV中的HSV到JPEG时出错
- HSV 中的高效范围,具有循环色调范围
- 如何在 OpenCv 中使用 HSV 阈值和轮廓从图像中提取皮肤
- OpenCV BGR value modification
- 在OpenCV中使用HSV有效地阈值红色
- 在opencv, c++中转换bgr为hsv