OpenCV截取ROI区域——多种形状(圆形)

14 篇文章 0 订阅

背景:在做一个中国象棋机器人的项目,项目中需要识别象棋棋子上的汉字,计划采用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.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 < m_allcenter.size(); i++)
    {
        Mat dst;
        Mat mask = Mat::zeros(templ.size(), CV_8U);
        Point center(mask.cols / 2, mask.rows / 2);
        int radius = cv::min(mask.cols, mask.rows) / 2;
        circle(mask, center, radius, Scalar(255),  -1);


        Rect rc(m_allcenter[i].x - mask.cols / 2, m_allcenter[i].y - mask.rows / 2, mask.cols, mask.rows);
        Mat subMat(_enhance, rc);
        subMat.copyTo(dst, mask);
        Scalar scalar = mean(dst);
        m_allAveBright.push_back(scalar.val[0]);    
//        circle(_enhance, m_allcenter[i], radius, Scalar(255, 0, 0), 2);
    }
  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值