RotatedRect类转换成Rect类
RotatedRect该类表示平面上的旋转矩形,包含以下三个部分的参数:1、矩形中心点(质心)2、矩形边长(长和宽)3、旋转角度(在opencv中,坐标的原点在左上角,与x轴平行的方向为角度为0,逆时针旋转角度为负,顺时针旋转角度为正。角度是水平轴(x轴)顺时针旋转,与碰到的第一个边的夹角度数。而opencv默认把这个边的边长作为height。)
由于RotatedRect带了旋转角度的参数,所以没有直接转成不带角度的Rect类。因此需要我们对图像做一个初步的预处理。一般的预处理流程如下:二值化区域分割—角度矩阵计算—仿射变化。
预处理代码如下:
Mat src = imread("图片地址");
Mat result,img_gray;
if(src.empty()){
cout << "图片没读到!" << endl;
getchar();
return -1;
}
cvtColor(src,img_gray,CV_BGR2GRAY);
Mat thresh_img(src.size(),CV_8UC1);
threshold(img_gray,thresh_img,230,255,THRESH_BINARY_INV);
vector<vector<Point>> contours;
findContours(thresh_img,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);//查找轮廓
RotatedRect mr = minAreaRect(Mat(contours[0]));//最小外界矩形
float angle=0;
Size si = mr.size;
//判断角度
if(mr.size.width <= mr.size.height){
angle = mr.angle + 90;
int tm = si.width;
si.width = si.height;
si.height = tm;
}else{
angle = mr.angle;
}
Mat rotmat = getRotationMatrix2D(mr.center,angle,1);
Mat deal_img;
warpAffine(src,deal_img,rotmat,src.size());
实现效果如下:
原始图片:
仿射变化后图片:
然后再依据仿射变化后的坐标,进行ROI操作。
用Rect绘制矩形ROI即可。