博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Opencv 最小外接矩形合并拼接
阅读量:4594 次
发布时间:2019-06-09

本文共 2980 字,大约阅读时间需要 9 分钟。

前一篇画出了最小外接矩形,但是有时候画出来的矩形由于中间像素干扰或者是其他原因矩形框并不是真正想要的

如图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.y
rect2.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

 

转载于:https://www.cnblogs.com/dzzy/p/9267995.html

你可能感兴趣的文章
ERP光有主生产计划不够 还得详细生产排程
查看>>
HTML5 2D平台游戏开发#2跳跃与二段跳
查看>>
【bzoj3238】【Ahoi2013】差异
查看>>
Spring源码:Spring IoC容器加载过程(1)
查看>>
Hive row_number() 等用法
查看>>
vue如何使用rules对表单字段进行校验
查看>>
ural 2032 Conspiracy Theory and Rebranding (数学水题)
查看>>
jqZoom插件
查看>>
lambda
查看>>
?: $ 用法
查看>>
R语言与数据挖掘学习笔记
查看>>
asp.net甘特图控件免费下载地址
查看>>
Linux 上的Tomcat配置输入域名直接访问项目
查看>>
Ubuntu12.04安装YouCompleteMe插件
查看>>
MySQL基础命令小结
查看>>
vue中使用sass的配置方法
查看>>
PHP读取XML数据中CDATA内数值
查看>>
JMeter执行dos命令
查看>>
Spring MVC 对静态资源的处理
查看>>
水晶报表
查看>>