vector<vector<Point>>::iterator itc = contours.begin();
vector<RotatedRect> rect;
for(;itc != contours.end();)
{
RotatedRect mr = minAreaRect(contours[164]);//啊啊啊,直接就把轮廓转换成mat,还是用没见过的方法
if(!verifySizes(mr))
{
itc = contours.erase(itc);
}
else
{
rect.push_back(mr);
itc++;
}
}
今天写这段代码的时候出不来想要的轮廓,但是调试也调试不出来,然后花了一个下午来解决
首先是我想给每一个轮廓标号,然后看车牌所在的轮廓是多少号
所以用到了如下的代码
for( int i = 0; i< contours.size(); i++ )
{
drawContours( result, contours,164,Scalar(0,0,255) );
string str = to_string((_ULonglong)i);
Point point(contours[i][0].x,contours[i][0].y);
putText(result,str,point, FONT_HERSHEY_PLAIN, 1, Scalar(0,0,200));
}
之后我知道了想要的轮廓的下标
然后我想知道每一个轮廓的宽高比 ,有了下边这些代码
//找到每一个轮廓的宽高比
RotatedRect m = minAreaRect(contours[164]);
int height = m.size.width;
int weight = m.size.height;
float scale = weight/height;
cout<<"height = "<<height<<endl<<"weight = "<<weight<<endl<<"scale = "<<scale<<endl;
我发现我想要的轮廓符合条件,但是就是画不出来
所以有了下面这行代码
RotatedRect mr = minAreaRect(contours[164]);
我将该轮廓直接作为参数传递给了minAreaRect()
然后进入下面的语句调试
RotatedRect mr = minAreaRect(contours[164]);//啊啊啊,直接就把轮廓转换成mat,还是用没见过的方法
if(!verifySizes(mr))
{
itc = contours.erase(itc);
}
else
{
rect.push_back(mr);
itc++;
}
其中vector.erase的用法在另一片转载的博文
进入到verifySizes()里面
int area = mr.size.height * mr.size.width;
float r = mr.size.width / mr.size.height;
if(r<1)
r = mr.size.height / mr.size.width;
我当时写的是
float r = mr.size.height / mr.size.width;
导致 编译器又定义了一个r ,该变量的作用域是if语句块内