精华内容
下载资源
问答
  • opencv 连通区域的最小外接矩形
    千次阅读
    2021-01-17 13:30:03

    #include "cv.h"

    #include "highgui.h"

    #include

    #include

    //#include "otsu.h"

    int main(int argc,char** argv)

    {

    IplImage *src,*gray,*bw,*dst;

    CvMemStorage* storage=cvCreateMemStorage(0);

    CvSeq* contour=0;

    char* filename=argc==2?argv[1]:"5.jpg";

    if(!filename)

    printf("can't open the file:%d\n",filename);

    src=cvLoadImage("D:\\xsz\\Debug\\图片\\3.jpg",1);

    cvNamedWindow("image",1);

    cvShowImage("image",src);

    gray=cvCreateImage(cvSize(src->width,src->height),src->depth,1);

    cvCvtColor(src,gray,CV_BGR2GRAY);

    int hei,wid;

    hei=gray->height;//注意此处是gray,otsu中要用到hei,wid,已在otsu.h中全局定义;

    wid=gray->width;

    printf("图像的高为:%d,宽为:%d\n\n",hei,wid);

    cvNamedWindow("image2",1);

    cvShowImage("image2",gray);

    bw=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);

    cvThreshold(gray,bw,128,255,CV_THRESH_BINARY_INV);

    cvNamedWindow("image4",1);

    cvShowImage("image4",bw);

    //wb=cvCloneImage(bw);

    // cvNot(bw,wb); 只有当目标区域为黑色背景时候,才对其取反。

    dst=cvCloneImage(src);

    cvFindContours(bw,storage,&contour,sizeof(CvContour),CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE);

    for(;contour!=0;contour=contour->h_next)

    {CvBox2D rect=cvMinAreaRect2(contour,storage);

    CvPoint2D32f rect_pts0[4];

    cvBoxPoints(rect, rect_pts0);

    //因为cvPolyLine要求点集的输入类型是CvPoint**

    //所以要把 CvPoint2D32f 型的 rect_pts0 转换为 CvPoint 型的 rect_pts

    //并赋予一个对应的指针 *pt

    int npts = 4,k=0;

    int aaa=0,bbb=0;

    CvPoint rect_pts[4], *pt = rect_pts;

    printf("连通区域最小外接矩形顶点坐标分别为:\n");

    for (int i=0; i<4; i++)

    {

    rect_pts[i]= cvPointFrom32f(rect_pts0[i]);

    printf("%d %d\n",rect_pts[i].x,rect_pts[i].y);

    aaa=(int)sqrt((pow((rect_pts[0].x-rect_pts[1].x),2)+pow((rect_pts[0].y-rect_pts[1].y),2)));

    bbb=(int)sqrt((pow((rect_pts[0].x-rect_pts[3].x),2)+pow((rect_pts[0].y-rect_pts[3].y),2)));

    if(aaa

    {

    k=aaa;

    aaa=bbb;

    bbb=k;

    }

    }

    printf("最小外接矩形的长为:%d,宽为:%d。\n\n",aaa,bbb);

    //chang=rect_pts[0]-rect_pts[3];

    //kuan=rect_pts[0]-rect_pts[1];

    //printf("最小外接矩形的长为:%d,宽为:%d\n",chang,kuan);

    //画出Box

    cvPolyLine(dst, &pt, &npts, 1, 1, CV_RGB(255,0,0), 1);

    }

    cvNamedWindow("image5",1);

    cvShowImage("image5",dst);

    cvWaitKey(0);//注意此句放的位置,放的不对则。。。

    cvDestroyWindow("image");

    cvDestroyWindow("image2");

    cvDestroyWindow("image4");

    cvDestroyWindow("image5");

    cvReleaseImage(&src);

    cvReleaseImage(&gray);

    cvReleaseImage(&bw);

    cvReleaseImage(&dst);

    return 0;

    }

    更多相关内容
  • Opencv中求点集的最小外结使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle。minAreaRect方法原型:RotatedRect minAreaRect( InputArray points );输入参数points是所要求最小外结的点集...

    Opencv中求点集的最小外结矩使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle。

    minAreaRect方法原型:

    RotatedRect minAreaRect( InputArray points );

    输入参数points是所要求最小外结矩的点集数组或向量;

    minEnclosingCircle方法原型:

    void minEnclosingCircle( InputArray points,

    CV_OUT Point2f& center, CV_OUT float& radius );

    第一个参数points是所要求最小外结圆的点集数组或向量;

    第二个参数Point2f类型的center是求得的最小外接圆的中心坐标;

    第三个参数float类型的radius是求得的最小外接圆的半径;

    使用minAreaRect和minEnclosingCircle方法分别求最小外接矩和圆:

    #include "core/core.hpp"

    #include "highgui/highgui.hpp"

    #include "imgproc/imgproc.hpp"

    #include "iostream"

    using namespace std;

    using namespace cv;

    int main(int argc,char *argv[])

    {

    Mat imageSource=imread(argv[1],0);

    imshow("Source Image",imageSource);

    Mat image;

    blur(imageSource,image,Size(3,3));

    threshold(image,image,0,255,CV_THRESH_OTSU);

    imshow("Threshold Image",image);

    //寻找最外层轮廓

    vector> contours;

    vector hierarchy;

    findContours(image,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_NONE,Point());

    Mat imageContours=Mat::zeros(image.size(),CV_8UC1); //最小外接矩形画布

    Mat imageContours1=Mat::zeros(image.size(),CV_8UC1); //最小外结圆画布

    for(int i=0;i

    {

    //绘制轮廓

    drawContours(imageContours,contours,i,Scalar(255),1,8,hierarchy);

    drawContours(imageContours1,contours,i,Scalar(255),1,8,hierarchy);

    //绘制轮廓的最小外结矩形

    RotatedRect rect=minAreaRect(contours[i]);

    Point2f P[4];

    rect.points(P);

    for(int j=0;j<=3;j++)

    {

    line(imageContours,P[j],P[(j+1)%4],Scalar(255),2);

    }

    //绘制轮廓的最小外结圆

    Point2f center; float radius;

    minEnclosingCircle(contours[i],center,radius);

    circle(imageContours1,center,radius,Scalar(255),2);

    }

    imshow("MinAreaRect",imageContours);

    imshow("MinAreaCircle",imageContours1);

    waitKey(0);

    return 0;

    作图步骤:

    1. 对原始图像均值滤波并二值化;

    2. 求图像的最外层轮廓;

    3. 使用minAreaRect方法求轮廓的最小外接矩形,转化求得矩形的四个顶点坐标,并绘制矩形;

    4. 使用minEnclosingCircle方法求轮廓的最小外接圆,获取圆心和半径信息,并绘制圆;

    原始图像:

    j1hcxqsllk5.jpg

    最小外接矩:

    sx2yyytcwlm.jpg

    最小外接圆:

    5uorbzqqdxl.jpg

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

    展开全文
  • 点集最小外接矩算法

    千次阅读 2017-06-01 12:39:42
    题目简述:給出一个平面点集S,求一个面积最小的矩形使其包含S所有的点。 预备知识:在求解这道题之前我们先要了解一些关于凸包的知识。什么是凸包?简单地说,对于一个平面点集S,我们把完全包含该点集的最小的凸...

    作者:冯浩 时间: 2007.10.11 文档类型/出处:NOI专刊
    题目简述:

    給出一个平面点集S,求一个面积最小的矩形使其包含S所有的点。
    

    预备知识:

    在求解这道题之前我们先要了解一些关于凸包的知识。
    
    什么是凸包?简单地说,对于一个平面点集S,我们把完全包含该点集的最小的凸多边形叫做点集S的凸包H。
    
    凸包一个很重要的性质就是它“凸”的性质。这个性质对我们理解和计算凸包都有很大的帮助。
    

    I) 对点集S中任意一点a,当且仅当存在直线p过a点并使得S中除a外所有点均在p的一侧,则a为凸包上的一顶点。

    II) 对点集S中任意两点a,b,当且仅当S中除a,b以外所有点都在过点a,b的直线p的一侧,则线段ab为凸包上的一条边。

    III) 对点集S中任意四点a,b,c,d,当d在三角形abc中(包括边),则d不是凸包上的点。

    上面的几条关于凸包“凸”的性质为我们计算凸包提供了一个基础。这里我们将介绍两种简单且被广泛运用的算法――Gift-Wrapping和Graham-Scan算法。
    

    Gift-Wrapping算法:

    通过性质(I),我们可以找到一个特殊点,如具有最小y坐标且x坐标尽可能小的点。将它作为计算凸包的第一个顶点。确定了起点后,我们就可以通过Gift-Wrapping算法计算出点集的凸包。下面的步骤很直观的描述了这个算法:
    

    1) 把点集中所有点都看成是固定在平面上的柱子,想象我们在起始点柱子上系上一根身子。

    2) 把绳子沿水平方向向右拉直,并逆时针旋转,当绳子碰上一根柱子,则对应了凸包上的一点

    3) 继续旋转绳子,每次确定一个凸包上的顶点,直至绳子回到起点。

              图一:Gift-Wrapping算法计算凸包的过程
    

    每次通过旋转绳子找到下一个凸包顶点需要对点集中所有剩余点进行一次比较,所以这

    一步的时间复杂度是O(n)。每个凸包上的顶点都需要进行一次旋转操作,而最坏情况下,凸包顶点个数可以和点集个数相等,所以整个Gift-Wrapping算法的时间复杂度是O(n2)的。

    Graham-Scan算法:

    Gift-Wrapping算法无论从理解还是从实现上来说,它都是十分简单的。但由于它的复杂度并不理想,我们无法利用它来求解大规模的凸包问题。因而,我们将介绍一种高效的计算凸包的算法――Graham-Scan。
    

    Graham-Scan算法主要可分成两部分:

    1) 同Gift-Wrapping一样,需要先找出一个起始点。将这个点作为原点,进行夹角排序。

    2) 先将起始点压入堆栈H中,再按照已经排好的顺序对每一个点进行扫描,同时维护堆栈H。这个堆栈表示的是到目前为止,所有已经扫描过的点对应的凸包。每当扫描一个点p的时候:

    a) 如果堆栈的元素少2个或者堆栈顶端的两个点与p构成左转关系,则将p压入堆栈中。

    b) 否则,栈顶元素出栈并继续进行a的判断。

    当所有点都扫描完后,堆栈H即为我们要求的凸包。

     图二:Graham-Scan算法的扫描过程(堆栈H储存的即实线连接起来的点)
    

    分析Graham-Scan的复杂度:第一步中找出起点并进行极角排序的复杂度是 O(n log n)。第二步中每一个点仅会被扫描一次并相应维护一次堆栈H 。而维护堆栈过程中每次访问堆栈H中的点,要么这个点被删除,要么就停止堆栈的维护,所以所有堆栈维护加起来最多只访问了2n次。故这部分的复杂度是O(n)。综合起来,Graham-Scan算法的时间复杂度是O(n log n)的。

    算法分析:

    现在考虑这道题目,题目要我们求出一个最小面积的矩形能够覆盖给定的所有点。易知矩形覆盖所有点当且仅当它覆盖这些点的凸包。故而,问题可以转化为对于一个凸包,求出一个面积最小的矩形来覆盖它。

    那么这个覆盖凸包的最小矩形有什么性质呢?

    首先,这个矩形的四条边上必然都有凸包的顶点。这个很容易想清楚,如果矩形的某条边没有碰上凸包的顶点,那么我们一定能把这条边向里压,从而得到一个更小的满足条件的矩形。

    其次,这个矩形至少有一条边与凸包上的一边重合。这个性质不容易直观地想清楚,需要书面证明一下。由于完整的证明需要分成很多情况来讨论,比较繁琐,所以这里仅选取其中的一种情况来证明,其他情况可以类似地进行证明。

    利用反证法,我们假设覆盖凸包的最小矩形所有边都没有和凸包的边有重合,也就是说,最小矩形的每条边上仅有一个凸包的顶点。如图三所示,矩形ABCD是覆盖凸包的最小矩形,M、N、P、Q为凸包在矩形四条边上的顶点。我们分别作MM’⊥ CD,NN’⊥ AD。则矩形ABCD的面积S = MP×Cos(∠PMM’)×NQ×Cos(∠QNN’)。我们将矩形旋转X度(顺时针为正,逆时针为负),仍使矩形覆盖凸包且M、N、P、Q分别在它的四边上。则此时新矩形的面积S = MP×Cos(∠PMM’+ X)×NQ×Cos(∠QNN’- X) 。我们仅需考虑Cos(∠PMM’+ X)×Cos(∠QNN’- X)的单调性。

    Cos(∠PMM’+ X)×Cos(∠QNN’- X)

    = 1/2[Cos(∠PMM’+ X + ∠QNN’- X) + Cos(∠PMM’+ X - ∠QNN’+ X)]

    = 1/2[Cos(∠PMM’+ ∠QNN’) + Cos(∠PMM’- ∠QNN’+ 2X)]

    ∵0≤∠PMM’< π/2 , 0≤∠QNN’< π/2

    ∴-π/2 <∠PMM’- ∠QNN’< π/2

    ∴Cos(∠PMM’- ∠QNN’)不可能取到最小值

    ∴x在0左边的一个区间中f(x) = Cos(∠PMM’- ∠QNN’+ 2X)递增,或x在0右边一个区间中f(x) = Cos(∠PMM’- ∠QNN’+ 2X)递减。

    因而,对于这样的矩形,我们总可以顺时针或逆时针旋转一个小角度,从而获得一个更小的矩形,这与假设矛盾。故最小矩形至少有一条边与凸包一边重合。

    了解到最小矩形所具有的这两个性质后,我们就能够很容易的想到一种算法,枚举凸包上哪条边与矩形的边重合,再找出在这条直线投影的正负方向上最远的和到直线距离最远的三点,从而确定和计算出矩形的面积,最后选取最小值,即为覆盖凸包的最小矩形的面积。
    

    我们用最朴素的方法去实现它,枚举每条边后再把剩余的点都扫描一遍,来找出另外三点,计算出矩形的面积。这样做时间复杂度是O(n2)得。就本题来说已经可以接受了。但如果规模再大一点,怎么办呢?我们能不能做得更好呢?

    答案是能!我们还有一个很重要的信息没有利用到,对凸包上任意一条边,依次计算出凸包顶点到它的距离或投影距离,构成的序列总是一个先增再降的。同时,注意到如果逆时针顺序枚举重合的边时,每次找出来的另外三点也总是在向逆时针方向移动。

    由此,我们就得到了一个更加高效的算法。枚举过程中,逆时针旋转到下一条边后不需要再重新扫描所有点,只要分别从上一条边确定的三点出发,向后比较,找到最大值,来更新这三个点即可。

    在枚举过程中,三个点的指针都只会对每个顶点访问一次,所以这个过程的平摊复杂度是O(n)的。结合前面计算凸包的过程,在O(n log n)的时间内我们就能够圆满地解决这题了。

    了解到最小矩形所具有的这两个性质后,我们就能够很容易的想到一种算法,枚举凸包上哪条边与矩形的边重合,再找出在这条直线投影的正负方向上最远的和到直线距离最远的三点,从而确定和计算出矩形的面积,最后选取最小值,即为覆盖凸包的最小矩形的面积。
    
    展开全文
  • 最小外接矩形

    2021-12-08 21:40:44
    使用opencv返回点集cnt的最小外接矩形,所用函数为minAreaRect(cnt) ,cnt是所要求最小外接矩形的点集数组或向量,这个点集不定个数。 这个矩形是可以有偏转角度的,可以与图像的边界不平行。 调用形式:...

    使用opencv返回点集cnt的最小外接矩形,所用函数为minAreaRect(cnt) ,cnt是所要求最小外接矩形的点集数组或向量,这个点集不定个数。

    这个矩形是可以有偏转角度的,可以与图像的边界不平行。

    调用形式:RotatedRect minAreaRect(InputArray points)

    InputArray points:表示输入的点集

    输出是矩形的四个点坐标。

    例如: box[i] = minAreaRect(Mat(contours[i]));

                box[i].points(rect);  //把最小外接矩形四个端点复制给rect数组

    最小外接矩形的4个顶点顺序、中心坐标、宽度、高度、旋转角度(是度数形式,不是弧度数)的对应关系如下:

    注意:旋转角度\alpha是水平轴(x轴)逆时针旋转,与碰到的矩形的第一条边的夹角。并且这个边的边长是width,另一条边边长是height。也就是说,在这里,width与height不是按照长短来定义的。

    猜测,没有验证:距离X轴最远的应该是Rect[0],然后顺时针旋转分别为Rect[1]、Rect[2]、Rect[3]。

    在opencv中,坐标系原点在左上角,相对于x轴,逆时针旋转角度为负,顺时针旋转角度为正。在这里,\alpha∈(-90度,0]。


    参考文献:https://blog.csdn.net/lanyuelvyun/article/details/76614872 

    展开全文
  • 多物体的长宽面积测量程序基于最小外接矩形-readme.docx 本帖最后由 caumine 于 2013-7-29 22:22 编辑 该程序可用来测量物体长宽面积。其基本原理是将图像二值,分离出目标区域,再根据最小外接矩形,计算物体...
  • nbsp图形图像一种获取图像区域最小外接矩形的算法及实现.pdf3页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。 下载提示1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔...
  • 想学习OpenCV进行图像处理的可以参考下,若需要里面的头文件联系:liuqingjie2@163.com
  • //绘制最小外接矩形的中心点 // rectangle(dstImg, Point(boundRect.x, boundRect.y), Point(boundRect.x + boundRect.width, boundRect.y + boundRect.height), Scalar(0, 255, 0), 2, 8); rectangle(dstImg, ...
  • 转载自:... OpenCV中求点集的最小外结使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle。 minAreaRect方法原型: RotatedRect minAreaRect( InputArray points ); 
  • 【测量篇】 最小外接矩形算法

    千次阅读 2022-02-11 10:37:44
    今天我将带领大家从【测量篇】开始学习,要学习到的算法就是——最小外接矩形! 机器视觉定位方法很多如: 基于特征点匹配的、基于形状的、基于外截圆、外截矩形的等等。其中基于最小外接矩形的定位方法是我们常见...
  • MATLAB求二值图像的最小外接矩形

    千次阅读 2021-05-03 21:36:46
    求二值图像的最小外接矩形算法描述步骤流程源代码结论 算法描述 计算最小外接矩形(MER)的一种方法是,将物体的边界以每次以一定的角度增量(例如3°)在90°范围内旋转。每旋转一次记录一次其坐标系方向上的外接...
  • https://blog.csdn.net/weixin_40647819/article/details/80884594
  • opencv 获取最小外接矩形

    千次阅读 2019-05-19 16:21:31
    //最小外接矩形的4个端点 width = box[i].size.width; height = box[i].size.height; if (height >= width) { float x = 0; x = height; height = width; width = x; } ratio = width / ...
  • opencv求最小外接矩阵

    千次阅读 2018-11-08 19:46:40
    最小外接矩阵的基本原理: 获取点簇最开始的minx,maxx,miny,maxy确定最初的外接矩形,求外接矩形的面积,然后对点簇进行旋转,按照下面公式即可: 旋转之后,求出新的minx,maxx,miny,maxy,计算此时的...
  • 1.边缘检测、轮廓查找、轮廓筛选、绘制最小外接矩、尺寸测量和标注尺寸,代码如下: //开发环境:VS2015+OPENCV3.2 #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> ...
  • 凸包最小外接矩形

    千次阅读 2019-06-30 17:07:14
    获取点的凸包之后,可以实现以下获取凸包的最小外接矩形,获取思路: 1、以其中两点作为矩形的一条边 2、以该边作为x轴基坐标,并做y轴基坐标 3、将所有点以该基坐标进行旋转,找到以该边为基准的所有点的x坐标的...
  • C++ OpenCV4绘制轮廓最小外接矩形

    千次阅读 2020-04-13 18:59:01
    C++ OpenCV4绘制轮廓最小外接矩形使用方法发生了一些变化: OpenCV2/3的代码: findContours(srcImg, contours, hierarcy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); cout<<"num="<<contours.size...
  • 2018a版本MatLab利用regionprops函数获取图片中物体最小外接矩形 本次内容,用于介绍利用matlab中的regionprops函数来获取图像区域中的物体的最小外接矩形信息(位置、长、宽)。 1.regionprops函数 regionprops函数...
  • 二值图像分析—轮廓最小外接矩形

    千次阅读 2019-10-30 17:11:27
    OpenCV中最小外接矩形 说明 brief Finds a rotated rectangle of the minimum area enclosing the input 2D point set. 查找包含输入二维点集的最小区域的旋转矩形。 该函数计算并返回指定点集的最小区域边界矩形...
  • OpenCV python 轮廓(连通域)最小外接矩形 import cv2 import numpy as np def main(): # 1.导入图片 img_src = cv2.imread("cc.jpg") # 2.灰度化,二值化 img_gray = cv2.cvtColor(img_src, cv2.COLOR_BGR2...
  • 【OpenCV】物体最小外接矩形

    千次阅读 2019-02-05 23:06:03
    一种简易的识别方法,通过目标物体的最小外接矩形来识别其位置和位姿。(附代码)
  • 本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp轮廓特征属性及应用(三)---最小外接矩形!
  • 轮廓的最小外接椭圆 轮廓的多边形逼近 轮廓的最小外接圆 一、效果 轮廓几何的质心 轮廓的最大外接矩形 轮廓的凸包 轮廓的最小外接矩形 轮廓的最小外接三角形 轮廓的最小外接椭圆 轮廓的多边形逼近 轮廓的最小外接...
  • import cv2 ...包含多个区域的最小外接矩形''' image = cv2.imread('./label.png') B, G, R = cv2.split(image) ret, thresh = cv2.threshold(G, 128, 255, cv2.THRESH_BINARY) print(thresh....
  • 在图像裁剪操作中,opencv和pillow两个库都具有相应的函数,但是这两个库中的函数仅仅能对与图片平行的矩形进行裁剪操作,如果想要对目标的最小外接矩形进行裁剪该如何操作呢?如下所示: 具体处理该问题的思路...
  • 假设图中黑色部分才是我们需要研究的对象,则外围的一堆白色是我们希望去掉的,这个时候用最小外接矩形来框住黑色部分,进而截取该部分的信息而忽略掉其他的信息变得实用。 下面,就给出查找图像轮廓中最小外接矩形...
  • 本章内容: 1. 轮廓查找 2. 绘制轮廓 1.搜索轮廓 2.绘制轮廓 输出结果 代码 #include <ostream> #include <opencv.hpp>... 1.... cv::String fileName = "/home/wang/de...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,143
精华内容 457
关键字:

最小外接矩