版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}
效果:
剪切后文件里: