OpenCv-C++-小案例实战-切边(一)

假如说现在有这么一张图片如下:
在这里插入图片描述
现在我想要去掉这张图外面的白色区域,只留下红色线框以内的部分。最终效果如图所示:
在这里插入图片描述

那么对于这样一张图片,解决思路如下:
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, &current_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,也就是说,它是一个完完全全的正的矩形,如果,它是一个旋转一定角度后的图片该怎么做呢?下一篇文章记录。

猜你喜欢

转载自blog.csdn.net/Daker_Huang/article/details/85033368