使用cv :: Mat图像(opencv)我如何检测对象?

时间:2013-07-05 13:39:31

标签: c++ opencv object-detection

使用

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

}

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

2 个答案:

答案 0 :(得分:1)

一些提示:

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

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

  • 用于跟踪opencv的meanshift用于帮助您。

答案 1 :(得分:1)

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

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

结果将是二进制图片,只是find the contourdraw bounding rectangle