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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abcvincent/article/details/79275533

将轮廓剪切出来然后单独保存到一个文件夹里,基本方法是通过轮廓最小外接矩形来对图像进行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);
}
效果:

剪切后文件里:


猜你喜欢

转载自blog.csdn.net/abcvincent/article/details/79275533