1

使用

Mat image;

我用了

inRange(image,Scalar(170,100,0),Scalar(255,255,70),image);

我检测到蓝色的对象,但我无法在对象周围绘制矩形。

我应该使用面膜吗?或者其他的东西?

inRange(image,Scalar(170,100,0),Scalar(255,255,70),image);
GaussianBlur(image,image,Size(9,9),1.5);

for(int i = 2; i <image.cols-2;i++)
 for(int j = 2; j <image.rows-2;j++){
  if( image.at<Vec3b>(i-1,j-1)[0] > 200 &&
    image.at<Vec3b>(i-1,j)[0] > 200 &&
    image.at<Vec3b>(i-1,j+1)[0] > 200 &&
    image.at<Vec3b>(i,j-1)[0] > 200 &&
    image.at<Vec3b>(i,j)[0] > 200 &&
    image.at<Vec3b>(i,j+1)[0] > 200 &&
    image.at<Vec3b>(i+1,j-1)[0] > 200 &&
    image.at<Vec3b>(i+1,j)[0] > 200 &&
    image.at<Vec3b>(i+1,j+1)[0] > 200 
)
{

    if(min_x > i)
        min_x = i;
    if(min_y >j)
        min_y = j;
    if(max_x < i)
        max_x =i;
    if(max_y < j)
        max_y = j;

}
 }
 if(!(max_x==0 && max_y==0 && min_x==image.rows && min_y == image.cols))
 {
    rectangle(image,Point(min_x,min_y),Point(max_x,max_y),CV_RGB(255,0,0),2);
 }

  imshow("working", image);
  if(waitKey(100) >= 0) break;
}

}

这不起作用并且运行时错误。我不知道为什么..帮帮我!

4

2 回答 2

1

您不能将 RGB 图像用于 inrange 方法。您应该将图像转换为 HSV 颜色空间,然后使用蓝色的色调范围,即 95-135。RGB 空间有很多“蓝色”的可能性。

inRange(image,Scalar(95,0,0),Scalar(135,255,255),image);

结果将是一个二值图像,只需找到轮廓并在其周围绘制边界矩形。

于 2013-07-05T14:17:33.933 回答
1

一些技巧:

  • 您的图像可能是CV_8U3C,但 inRange 可能会将其转换为CV_8U,因此更好地用于输出新的 Mat 实例。

  • 用于cv::findContours检测您的区域。

  • meanshiftopencv 用于跟踪的研究可能对您有所帮助。

于 2013-07-05T13:54:57.357 回答