【问题标题】:Using cv::Mat image(opencv) how can i detect object?使用 cv::Mat image(opencv) 我如何检测对象?
【发布时间】:2013-07-05 13:39:31
【问题描述】:

使用

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

}

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

【问题讨论】:

    标签: c++ opencv object-detection


    【解决方案1】:

    一些提示:

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

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

    • 研究meanshift 用于opencv 的跟踪,这可能会对您有所帮助。

    【讨论】:

      【解决方案2】:

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

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

      结果将是一个二值图像,只有 find the contourdraw bounding rectangle 在它周围。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-14
        • 2012-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多