使用
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;
}
}
这不起作用,运行时错误。 我不知道为什么......帮助我!
答案 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 contour和draw bounding rectangle。