在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;
}
}
}
现在我的问题是: -
此代码特别适用于一种颜色(绿色)我也想使其兼容其他颜色(即红色)..但我不知道我应该在这个代码中更改。谁能帮我 ?
答案 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。