OpenCV截取ROI区域

您所在的位置:网站首页 如何截圆形的图 OpenCV截取ROI区域

OpenCV截取ROI区域

2024-07-08 15:44| 来源: 网络整理| 查看: 265

背景:在做一个中国象棋机器人的项目,项目中需要识别象棋棋子上的汉字,计划采用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 contour; 5 vector pts; 6 pts.push_back(Point(30,45)); 7 pts.push_back(Point(100,15)); 8 pts.push_back(Point(300,145)); 9 pts.push_back(Point(330,240)); 10 pts.push_back(Point(50,250)); 11 contour.push_back(pts); 12 13 drawContours(roi,contour,0,Scalar::all(255),-1); 14 img.copyTo(dst,roi); 15 16 imshow("roi",roi); 17 imshow("img",img); 18 imshow("dst",dst);

如果要截取一个圆形区域,方法相似:

Mat dst = Mat::zeros(image.size(), image.type()); Mat mask = Mat::zeros(image.size(),CV_8U); Point circleCenter(mask.cols / 2, mask.rows / 2); int radius = min(mask.cols, mask.rows)/2; // 画圆 circle(mask, circleCenter, radius, Scalar(255),-1); image.copyTo(dst, mask);

如果要截取一个椭圆呢?也是一样的方法: ellipse(mask,circleCenter,Size(240,146),10,-180,180,Scalar(255),-1); 项目实例:

Mat _enhance; Mat templ = imread(m_tempFile, IMREAD_GRAYSCALE); Mat farm = imread(m_farmFile, IMREAD_GRAYSCALE); farm.convertTo(_enhance, -1, 2, 50); m_allAveBright.reserve(m_allcenter.size()); for(uint i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3