前一篇画出了最小外接矩形,但是有时候画出来的矩形由于中间像素干扰或者是其他原因矩形框并不是真正想要的
如图1是一个信号的雨图,被矩形框分割成了多个小框:
需要合并矩形框达到的效果:
主要思想:
扫描两次最小外接矩形,第一次扫描出的矩形是图一的小矩形,遍历vector指定一个合并最大距离(假设是80),达到指定距离使用画矩形函数将这两个矩形占据的组合区域染成实心矩形。
第二次扫描直接扫描之前画的实心矩形图确定最终边框
过程图 膨胀处理和像素翻转:
代码:
#include "core/core.hpp"#include "highgui/highgui.hpp"#include "imgproc/imgproc.hpp"#include "iostream"#include "cmath"using namespace std;using namespace cv;int Distance(Rect rect1,Rect rect2){ // 用于判断rect1在rect2的第三象限里 用于反转X轴用 bool isInversion; // 保存两个比较的点 Point point1; Point point2; // 判断 rect1 在rect2的上面还是下面 也就是说是在第一、二象限还是在三四象限 if(rect1.yrect2.x; if(isInversion) { // 取rect2的右上点 point1 = Point(rect2.x+rect2.width,rect2.y+rect2.height); // 取rect1的左下点 point2 = Point(rect1.x,rect1.y); }else { // 取rect2的左上点 point1 = Point(rect2.x,rect2.y+rect2.height); // 取rect1的右下点 point2 = Point(rect1.x+rect1.width,rect1.y); } } // 做向量减法 Point dPoint = point2 -point1; // 如果反转x轴 dPoint.x = isInversion? dPoint.x:-dPoint.x; // 如果这个向量在第三象限里 那么这两个矩形相交 返回-1 if(dPoint.x<0&& dPoint.y<0) return -1; // 如果x<0 返回y if(dPoint.x<0) return dPoint.y; // 如果y小于0 返回x if(dPoint.y<0) return dPoint.x; // 返回这个向量的长度 return 2333;}Mat change(Mat src){ int cPointR,cPointG,cPointB,cPoint; for(int i=0; i (i,j)[0]=src.at (i,j)[0]; cPointG=src.at (i,j)[1]=src.at (i,j)[1]; cPointR=src.at (i,j)[2]=src.at (i,j)[2]; if(cPointR>250||cPointG>250||cPointB>250) { src.at (i,j)[0]=0; src.at (i,j)[1]=0; src.at (i,j)[2]=0; } else { src.at (i,j)[0]=255; src.at (i,j)[1]=255; src.at (i,j)[2]=255; } cPointB=src.at (i,j)[0]=src.at (i,j)[0]; cPointG=src.at (i,j)[1]=src.at (i,j)[1]; cPointR=src.at (i,j)[2]=src.at (i,j)[2]; //cout<<"("< <<","< <<","< <<")"<<" "; } //cout< > contours0; vector hierarchy0; findContours(image,contours0,hierarchy0,RETR_EXTERNAL,CHAIN_APPROX_NONE,Point()); //imshow("最外层轮廓",image); ///连接矩形区域/// //Mat RECtest=imread("C:\\Users\\Administrator\\Desktop\\Rec\\temp.png",0); cout< < "<<(P_j[3].x-P_j[2].x)*(P_j[1].y-P_j[2].y)<<" "; Rect r_j = rect_j.boundingRect(); Rect r_i = rect_i.boundingRect(); //cout< <<" -> "< <<" "< <<" "; if(Distance(r_i,r_j)<=100) { int minx=min(P_i[2].x,P_j[2].x); int maxx=max(P_i[3].x,P_j[3].x); int miny=min(P_i[2].y,P_j[2].y); int maxy=max(P_i[0].y,P_j[0].y); rectangle(image,Point(minx,miny),Point(maxx,maxy),Scalar(255,255,255),-1,1);//画实心矩形 //rectangle(RECtest,Point(minx,miny),Point(maxx,maxy),Scalar(0,0,0),-1,1); //cout< <<","< <<" "< <<","< < > contours; vector hierarchy; findContours(image,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_NONE,Point()); Mat imageContours=Mat::zeros(image.size(),CV_8UC1); //最小外接矩形画布 for(int i=0; i