假如说现在有这么一张图片如下:
现在我想要去掉这张图外面的白色区域,只留下红色线框以内的部分。最终效果如图所示:
那么对于这样一张图片,解决思路如下:
1、边缘检测
2、轮廓发现
3、求最小外接矩形
4、ROI截取
放上代码:
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;
Mat src, dst, gray_src;
int current_level = 50;
int max_level = 255;
void cut_image(int, void*);
const char* output_title = "rectminArea";
int main(int argc, char**argv)
{
src = imread("D:/test/切边测试图.png", 1);
if (src.empty())
{
cout << "图片未找到" << endl;
return -1;
}
namedWindow(output_title,CV_WINDOW_AUTOSIZE);
createTrackbar("Value", output_title, ¤t_level, max_level, cut_image);
cut_image(0,0);
imshow("input image", src);
waitKey(0);
return 0;
}
void cut_image(int, void*)
{
Mat canyImg;
cvtColor(src, gray_src, CV_BGR2GRAY);
Canny(gray_src, canyImg, current_level, 2 * current_level, 3,false);
vector<vector<Point>> contours;
vector<Vec4i>hierachy;
Mat showImg = Mat::zeros(src.size(), CV_8UC3);
findContours(canyImg, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
RNG rng(12345);
int minw = src.cols*0.75;
int minh = src.rows*0.75;
Rect box; //获取roi区域
Mat contoursimg= Mat::zeros(src.size(), CV_8UC3);
for (size_t t = 0; t < contours.size(); t++)
{
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(contoursimg, contours, int(t), color, 1, 8, hierachy, 0, Point(0, 0));
RotatedRect minrect = minAreaRect(contours[t]); //获取轮廓的最小外接矩形
float angle = abs(minrect.angle);
if (minrect.size.height > minh && minrect.size.width > minw && minrect.size.width < (src.cols - 5))
{
Point2f pts[4];
minrect.points(pts); //获取最小外接矩形的四个顶点坐标
for(int i=0;i<4;i++)
{
line(showImg,pts[i], pts[(i + 1) % 4], color, 2, 8, 0);
cout << "X坐标:" << minrect.center.x <<" "<< "Y坐标:" << minrect.center.y << " "<<"偏移角度:" << angle << endl;
}
box = minrect.boundingRect();
}
if (box.width > 0 && box.height > 0)
{
Mat roiImg=src(box);//截取roi区域
imshow("roiImg", roiImg);
}
}
imshow(output_title, showImg);
imshow("contours image", contoursimg);
}
所以,最终结果为:
因为该图片旋转角度为0,也就是说,它是一个完完全全的正的矩形,如果,它是一个旋转一定角度后的图片该怎么做呢?下一篇文章记录。