【opencv学习之三十五】轮廓特征应用:按轮廓剪切图像ROI

本文介绍了一种基于轮廓最小外接矩形的图像ROI剪切方法,并通过代码实现了从原始图像中剪切轮廓并单独保存的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将轮廓剪切出来然后单独保存到一个文件夹里,基本方法是通过轮廓最小外接矩形来对图像进行ROI剪切操作,然后将剪切后的图像保存到文件夹里,循环此操作直到轮廓遍历完成;下面实现代码:

void imgContoursROI()//轮廓roi
{
    //1.查找轮廓的预处理
    Mat srcImg = imread("D:/ImageTest/convex.png");
    Mat copyImg = srcImg.clone();
//    GaussianBlur(srcImg,srcImg,Size(5,5),0,0);//高斯滤波,滤去噪声
    cvtColor(srcImg, srcImg, CV_BGR2GRAY);
    threshold(srcImg, srcImg, 200, 255, CV_THRESH_BINARY_INV);//确保黑中找白
    imshow("threshold", srcImg);
    //2.查找轮廓
    vector < vector<Point> > contours;
    findContours(srcImg, contours, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);//所有轮廓
    //3.遍历轮廓,找出正外接矩形
    Mat mask = Mat::zeros(srcImg.size(),CV_8UC3);//同原图一样大小,纯黑的mask图像
    Mat draw = Mat::zeros(srcImg.size(), CV_8UC3);//将原图copyTo到draw上,加上mask操作
    Mat temp = Mat::zeros(srcImg.size(), CV_8UC3);//每次循环,重置mask和draw
    Rect boundRect;//存储轮廓的正外接矩形
    for (int i = 0; i < contours.size(); i++)//遍历每个轮廓
    {
         Scalar color( (rand()&255), (rand()&255), (rand()&255) );//随机产生颜色 rand()产生随机数
        temp.copyTo(mask);//重置mask
        temp.copyTo(draw);//重置draw
        drawContours(mask,contours,i, color,-1);//在mask上用白色绘制轮廓,-1向内填充
        imshow("mask",mask);
        boundRect=boundingRect(contours[i]);//获得第i个轮廓的正外接矩形
        copyImg.copyTo(draw,mask);//将原图copyTo到draw上,加上mask操作
        imshow("draw", draw);
        Mat ROI = draw(boundRect);//定义ROI,即为draw上的boundRect区域
        char name[30] = { 0 };
        sprintf(name,"D:\\ImageTest\\temp\\%img.jpg",i);//格式化ROI文件名
        imwrite(name,ROI);//写ROI到本地
    }
    waitKey(0);
}
效果:

剪切后文件里:


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值