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

时间:2013-12-27 10:05:51

标签: javascript c++ objective-c opencv colors

在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;
    }
}
}

现在我的问题是: -

此代码特别适用于一种颜色(绿色)我也想使其兼容其他颜色(即红色)..但我不知道我应该在这个代码中更改。谁能帮我 ?

2 个答案:

答案 0 :(得分:1)

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

#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;
}

答案 1 :(得分:1)

如果不了解您对绿度的测量,计算测量值的线是:

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

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

要将检测到的颜色更改为红色,我最好的猜测是用+2替换+1并将+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;
    }
}
}

<击>

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

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

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