背景:在做一个中国象棋机器人的项目,项目中需要识别象棋棋子上的汉字,计划采用CNN的方式实现这一功能。在制作CNN训练的数据集的时候,需要一个截取象棋中心文字的问题。当我们定位到一个象棋的位置之后,我首先将包裹象棋的一个50*50的矩形取阈截取出来,但是,发现如果只是做矩形的截取的话,截取的图像仍然会包含一部分的棋盘,导致训练时的干扰,因此就考虑再做圆形的截取
语言:C++(Opencv3.4.1)
1、截取矩形的ROI:
Rect rc(m_allcenter[i].x - mask.cols / 2, m_allcenter[i].y - mask.rows / 2, mask.cols, mask.rows);
Mat subMat(_enhance, rc);
可以看到,在截取一个矩形的时候,比较简单,可以直接定义一个Opencv中的Rect对象,输入需要截取的矩形区域的坐标即可.
2、截取圆形的ROI:
这里涉及到截取一个不是矩形的区域,不管是截取一个圆形、椭圆,或者是截取一个不规则多边形,其方法都是使用contour(轮廓)来指定ROI。
比如,要截取一个多边形的ROI区域:
Mat dst;
2 Mat roi = Mat::zeros(img.size(),CV_8U);
3
4 vector<vector<Point>> contour;
5 vector<Point> pts;
6 pts.push_back(Point(30,45));
7 pts