openCV中的颜色检测-像素检查问题



在opencCV中,我得到了这个代码来检测他们检查每个像素值的颜色,获得所需的值并将其替换为白色,并将所有不必要的像素转换为黑色。这是代码。

int MaxC = 0;
for(int i = 0; i < img_output.rows; i++)
{
for(int j = 0; j < img_output.cols; j++)
{
nPixelPos = i*img_output.cols*cn + j*cn;
nCombinedVal = (pixelPtr[nPixelPos +2]) *( 255 - pixelPtr[nPixelPos +1]);
if (nCombinedVal > MaxC)
MaxC = nCombinedVal;
}
}
MaxC = MaxC / 255;
for(int i = 0; i < img_output.rows; i++)
{
for(int j = 0; j < img_output.cols; j++)
{
nPixelPos = i*img_output.cols*cn + j*cn;
nCombinedVal = (pixelPtr[nPixelPos +2]) *( 255 - pixelPtr[nPixelPos +1]);
nCombinedVal = (nCombinedVal/ MaxC);;
if (nCombinedVal > 230)
{
pixelPtr1[nPixelPos + 0]= nCombinedVal;
pixelPtr1[nPixelPos+ 1] = nCombinedVal;
pixelPtr1[nPixelPos + 2]= nCombinedVal;
}
else
{
pixelPtr1[nPixelPos + 0]= 0;
pixelPtr1[nPixelPos+ 1] = 0;
pixelPtr1[nPixelPos + 2]= 0;
}
}
}

现在我的问题是:-

这个代码特别适用于一种颜色(绿色),我也想让它与其他颜色(即红色)兼容。。但是我不知道我应该在哪里更改这个代码。有人能帮我吗?

在不了解绿色度测量的情况下,计算测量值的线是:

nCombinedVal = (pixelPtr[nPixelPos +2]) *( 255 - pixelPtr[nPixelPos +1]);

nPixelPos是像素的索引。如果图像遵循OpenCV BGR约定,+1将为绿色通道,+2将为红色通道。如果它遵循RGB约定,+1将仍然是绿色,但+2将是蓝色。

要将检测到的颜色更改为红色,我的最佳猜测是将+1替换为+2,并将+2更改为+1或+0。请务必修改这两行。

nCombinedVal = (pixelPtr[nPixelPos +1]) *( 255 - pixelPtr[nPixelPos +2]);

如果你愿意更换代码,我建议使用不同的颜色测量:

greenness = green - max(red, blue)
redness = red - max(green, blue)
blueness = blue - max(red, green)

在你的代码中看起来像这样:

for(int i = 0; i < img_output.rows; i++)
{
for(int j = 0; j < img_output.cols; j++)
{
nPixelPos = i*img_output.cols*cn + j*cn;
int greenness = int(pixelPtr[nPixelPos +1]) - max(pixelPtr[nPixelPos], pixelPtr[nPixelPos +2]);
if (greeness > 10)
{
pixelPtr1[nPixelPos + 0] = 255;
pixelPtr1[nPixelPos + 1] = 255;
pixelPtr1[nPixelPos + 2] = 255;
}
else
{
pixelPtr1[nPixelPos + 0] = 0;
pixelPtr1[nPixelPos + 1] = 0;
pixelPtr1[nPixelPos + 2] = 0;
}
}
}

EDIT:OpenCV以相反的顺序存储HSV颜色信息,并将色调除以2以适合一个字节(此处提供更多详细信息)。pixelPtr[nPixelPos+2]因此是色调,pixelPtr[nPixel Pos+1]是饱和度。要更改您要查找的颜色,请将行替换为以下内容:

nCombinedVal = abs(pixelPtr[nPixelPos +2]-target_hue) *( 255 - pixelPtr[nPixelPos +1]);

其中target_hue是要查找的色调除以二。

Hi您可以参考下面的代码,该代码将使用鼠标访问像素值并显示结果

#include <iostream>
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
Mat image, src;
char window_name[20]="Pixel Value Demo";
void onMouse( int event, int x, int y, int f, void* ){
image=src.clone();
Vec3b pix=image.at<Vec3b>(y,x);
int B=pix.val[0];
int G=pix.val[1];
int R=pix.val[2];

char name[30];
sprintf(name,"R=%d",R);
putText(image,name, Point(10,130) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );
sprintf(name,"G=%d",G);
putText(image,name, Point(10,170) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );
sprintf(name,"B=%d",B);
putText(image,name, Point(10,210) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );
sprintf(name,"X=%d",x);
putText(image,name, Point(10,300) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );
sprintf(name,"Y=%d",y);
putText(image,name, Point(10,340) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );
imshow( window_name, image );
}

int main( int argc, char** argv )
{
namedWindow( window_name, CV_WINDOW_AUTOSIZE );
src = imread( "ball.jpg");
imshow( window_name, src );
setMouseCallback( window_name, onMouse, 0 );
waitKey(0);
return 0;
}

最新更新