精华内容
下载资源
问答
  • 设(x,y)为矩形的左上角坐标,(w,h)为宽度和高度 import cv2 import numpy as np img = cv2.imread('img7.png') imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(imgray, 127...

    1.图像的矩

    cv2.moments()
    图像的矩可以帮助计算物体的某些特征,如对象的质心,对象的区域等.

    import cv2
    import numpy as np
    
    img = cv2.imread('img7.png',0)
    ret,thresh = cv2.threshold(img,127,255,0)
    im2,contours,hierarchy = cv2.findContours(thresh, 1, 2)
    
    cnt = contours[0]
    M = cv2.moments(cnt)
    print( M )
    
    输出:{'m00': 283.0, 'm10': 8260.666666666666, 'm01': 34747.666666666664, 'm20': 251349.8333333333, 'm11': 1008063.0, 'm02': 4274513.166666666, 'm30': 7941981.4, 'm21': 30484543.9, 'm12': 123258620.46666667, 'm03': 526819846.70000005, 'mu20': 10223.989595602674, 'mu11': -6208.702394974302, 'mu02': 8080.874165684916, 'mu30': 8302.495426246896, 'mu21': -14552.154961312423, 'mu12': 11791.528133469663, 'mu03': -3268.923251092434, 'nu20': 0.12765785058625623, 'nu11': -0.07752253611575, 'nu02': 0.10089867729257346, 'nu30': 0.006162296011483629, 'nu21': -0.010800931752771139, 'nu12': 0.008751933371317017, 'nu03': -0.0024262672459139235}
    

    此刻,可以提取有用的数据,如面积,质心等.
    质心由关系给出:

    cx = int(M['m10']/M['m00'])
    cy = int(M['m01']/M['m00'])
    

    2.轮廓面积

    cv2.contourArea(contour[, oriented])

    3.轮廓周长

    cv2.arcLength(curve, closed)第二个参数指定形状是否为闭合轮廓

    4.轮廓近似

    它根据我们指定的精度将轮廓形状近似为具有较少顶点数的另一个形状.它是Douglas-Peucker算法的一种实现方式.
    cv2.approxPolyDP(curve, epsilon, closed[, approxCurve])
    第二个参数epsilon,它是从轮廓到近似轮廓的最大距离.第三个参数指定曲线是否闭合.

    下面,在第二幅图像中,绿线表示epsilon =弧长的10%的近似曲线. 第三幅图像显示相同的epsilon =弧长的1%.

    import cv2
    import numpy as np
    
    img = cv2.imread('img8.png')
    cv2.imshow('src',img)
    imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, thresh = cv2.threshold(imgray, 127, 255, 0)
    im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    cnt = contours[1]
    
    epsilon = 0.1*cv2.arcLength(cnt,True)
    approx = cv2.approxPolyDP(cnt,epsilon,True)
    cv2.polylines(img, [approx], True, (0, 0, 255), 2)
    
    cv2.imshow('show',img)
    cv2.waitKey()
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    5.凸包

    凸包看起来类似轮廓近似,但是它不是(两者在某些情况下可能提供相同的结果).
    convexHull(points[, hull[, clockwise[, returnPoints]]]):检查曲线的凸性缺陷并进行修正.

    • points:传入的轮廓
    • hull:输出
    • clockwise:方向标志,如果为True,则顺时针方向输出凸包.
    • returnPoints:默认情况下为True,然后它返回hull points的坐标; 如果为False,则返回与hull points对应的轮廓点的索引
      下面的手形图像. 红线表示手的凸包, 双面箭头标记显示凸起缺陷.
      在这里插入图片描述
    import cv2
    import numpy as np
    
    img = cv2.imread('img8.png')
    
    imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, thresh = cv2.threshold(imgray, 127, 255, 0)
    im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    cnt = contours[1]
    
    hull = cv2.convexHull(cnt)
    

    returnPoints = True,得到以下值:

    array([[[192, 135]],
           [[  9, 135]],
           [[  9,  12]],
           [[192,  12]]], dtype=int32)
    

    如果想找到凸性缺陷,需要传递returnPoints = False,得到以下结果:

    array([[129],
           [ 67],
           [  0],
           [142]], dtype=int32)
    

    6.检查凸性

    cv2.isContourConvex(contour):检查曲线是否凸起

    7.外接矩形

    7.1 直边外接矩形

    它是一个直的矩形,它不考虑对象的旋转。因此,边界矩形的面积不会最小.
    cv.boundingRect()设(x,y)为矩形的左上角坐标,(w,h)为宽度和高度

    import cv2
    import numpy as np
    
    img = cv2.imread('img7.png')
    
    imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, thresh = cv2.threshold(imgray, 127, 255, 0)
    im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    cnt = contours[0]
    
    x,y,w,h = cv2.boundingRect(cnt)
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
    
    cv2.imshow('show',img)
    cv2.waitKey()
    

    在这里插入图片描述

    7.2 最小外接矩形

    cv.minAreaRect返回一个Box2D结构,其中包含以下detals - (center(x,y),(width,height),rotation of rotation)
    cv.boxPoints画上述矩形.

    rect = cv2.minAreaRect(cnt)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    cv2.drawContours(img,[box],0,(0,0,255),2)
    

    在这里插入图片描述

    8 最小封闭圈

    (x,y),radius = cv2.minEnclosingCircle(cnt)
    center = (int(x),int(y))
    radius = int(radius)
    cv2.circle(img,center,radius,(0,255,0),2)
    

    9 拟合椭圆

    ellipse = cv2.fitEllipse(cnt)
    cv2.ellipse(img,ellipse,(0,255,0),2)
    

    在这里插入图片描述

    10 拟合直线

    rows,cols = img.shape[:2]
    [vx,vy,x,y] = cv2.fitLine(cnt, cv2.DIST_L2,0,0.01,0.01)
    lefty = int((-x*vy/vx) + y)
    righty = int(((cols-x)*vy/vx)+y)
    cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)
    

    在这里插入图片描述

    展开全文
  • Opencv Python 轮廓处理 Opencv python轮廓处理 本人大一数学系学渣菜鸟一枚,课程之余学习了OpenCV,把写的关于轮廓处理的知识分享一下,欢迎在评论区里给出宝贵意见! 我把代码放到一起了,要是运行的话最好复制到...
    ``python
    #program 1.绘制轮廓
    import numpy as np
    import cv2 as cv 
    #读取图像
    img = cv.imread("G:\sundries\CVpictures\practice1.jpg")
    #一些必要的操作:导入图像、二值化、canny边缘检测、cnt的给出
    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    #创建3*3的高斯滤波内核
    img_gray = cv.GaussianBlur(img_gray, (3, 3), 0)
    # canny边缘检测
    img_gray = cv.Canny(img_gray, 100, 300)
    ret, thresh = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)
    contours, hierarchy = cv.findContours(thresh, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
    cnt = contours[0] 
    #进行绘制
    cv.drawContours(img, contours, -1, (0,255,0), 3)
    cv.imshow("read", img)
    cv.waitKey(0) & 0xFF
    cv.destroyAllWindows() 
    
    #program 2.去除图像的矩形边框,找到并提取指定轮廓
    #由于图像在识别轮廓的过程中可能会把外框矩形也识别并画出来,所以我们找个办法把指定的轮廓去除
    import numpy as np
    import cv2 as cv 
    img = cv.imread("G:\sundries\CVpictures\practice1.jpg")
    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    img_gray = cv.Canny(img_gray, 100, 300)
    ret, thresh = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)
    contours, hierarchy = cv.findContours(thresh, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
    cnt = contours[0] 
    M = cv.moments(cnt)
    
    cv.imshow("thresh", thresh)
    '''    
    finContours(img, mode, method)
    mode(轮廓检索模式): 
    RETR_EXTERNAL :只检索最外面的轮廓; 
    RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;
    RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
    RETR_TREE(最常用):检索所有的轮廓,并重构嵌套轮廓的整个层次;
    
    method(轮廓逼近方法):
    CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。 
    CHAIN_APPROX_SIMPLE(最常用):压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
    '''
    # 查看轮廓的数量
    number = numpy.array(contours).shape
    # 复制图像,新的图像作为边界绘制的底图
    cp = img.copy() 
    res1 = cv.drawContours(cp, contours, -1, (0, 0, 255), 2)
    cp = img.copy()
    res2 = cv.drawContours(cp, contours, 0, (0, 0, 255), 2)
    # 合并两张图像
    res = numpy.hstack((res1, res2))
    print("number:", number)
    cv.imshow("res", res)
    cv.waitKey(0) & 0xFF
    cv.destroyAllWindows()
    
    #program 3.提取特征矩,进行简单计算
    '''
    关于图像的矩的一些解析:
    矩用来抽取图像(块)特征,本质上,Hu矩其实就是泰勒级数展开的对应项。其他类型的矩也是对应多项式展开的级数(如Legendre矩对应Legendre级数)。在图像里,低阶矩反映低频(主要的)信息,高阶矩反映高频(细节)信息,
    0阶矩( m[00]):目标区域的面积(Area)
    1阶矩( m[01] , m[10] ):目标区域的质心(Centroid)
    以目标区域的质心为中心构建中心矩,那么矩的计算时永远是目标区域中的点相对于目标区域的质心,而与目标区域的位置无关,即中心矩具备了平移不变性。
    2阶矩(m[20] ,m[02] , m[11] ):即惯性矩,可计算目标图像的方向
    3阶矩(m[30] , m[03] , m[12], m[21]):目标区域的方位和斜度,反应目标的扭曲
    Hu矩:目标区域往往伴随着空间变换(平移,尺度,旋转),所以需要在普通矩的基础上构造出具备不变性的矩组
    
    更多关于矩的知识可以参考https://www.cnblogs.com/ronny/p/3985810.html
    
    
    '''
    import numpy as np
    import cv2 as cv 
    img = cv.imread("G:\sundries\CVpictures\practice1.jpg")
    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    img_gray = cv.Canny(img_gray, 100, 300)
    ret, thresh = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)
    contours, hierarchy = cv.findContours(thresh, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
    cnt = contours[0] 
    M = cv.moments(cnt)
    #求图像面积
    area = cv.contourArea(cnt)
    #求图像周长
    perimeter = cv.arcLength(cnt,True)
    #第二参数可以用来指定对象的形状是闭合的(True)还是打开的(一条曲线)
    print(perimeter)
    print( M )
    print(area)
    
    #program 4.轮廓近似
    import numpy as np
    import cv2 as cv 
    img = cv.imread("G:\sundries\CVpictures\practice1.jpg")
    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    img_gray = cv.Canny(img_gray, 100, 300)
    ret, thresh = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)
    contours, hierarchy = cv.findContours(thresh, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
    cnt = contours[0]
    #参数设置
    epsilon = 0.1*cv.arcLength(cnt,True)
    approx = cv.approxPolyDP(cnt,epsilon,True)# 第三个函数参数若为true,则说明近似曲线是闭合的,它的首位都是相连,反之,若为false,则断开。
    cv.imshow('approx',img)
    cv.waitKey(0) & 0xFF
    cv.destroyAllWindows()
    
    #program 5.凸包
    import numpy as np
    import cv2 as cv 
    img = cv.imread("G:\sundries\CVpictures\practice1.jpg")
    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    img_gray = cv.Canny(img_gray, 100, 300)
    ret, thresh = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)
    contours, hierarchy = cv.findContours(thresh, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
    cnt = contours[0]
    img_result = img.copy()
    #获取连通域
    cont = get_contours(img_src)
    cv.drawContours(img_result, cont, -1, (0, 0, 255), 2)
    #获取凸包点,连接点
    hull_points = cv.convexHull(cont)#检查一个曲线的凸性缺陷并进行修正
    cv.polylines(img_result, [hull_points], True, (0, 255, 0), 2)
    cv.imshow("img_result", img_result)
    cv.waitKey(0) & 0xFF
    cv.destroyAllWindows() 
    
    #program 6.规则图形的拟合:矩形、旋转矩形、圆、椭圆
    import numpy as np
    import cv2 as cv 
    img = cv.imread("G:\sundries\CVpictures\practice1.jpg")
    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    img_gray = cv.Canny(img_gray, 100, 300)
    ret, thresh = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)
    contours, hierarchy = cv.findContours(thresh, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
    cnt = contours[0]
    x,y,w,h = cv.boundingRect(cnt)
    #拟合矩形
    img1 = cv.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
    cv.imshow("rectangle", img1)
    cv.waitKey(0) & 0xFF
    cv.destroyAllWindows() 
    #拟合旋转矩形
    rect = cv.minAreaRect(cnt)
    box = cv.boxPoints(rect)
    box = np.int0(box)
    img2 = cv.drawContours(img,[box],0,(0,0,255),2)
    cv.imshow("rotarec", img2)
    cv.waitKey(0) & 0xFF
    cv.destroyAllWindows()
    #拟合图像轮廓的最小闭合圈
    (x,y),radius = cv.minEnclosingCircle(cnt)
    center = (int(x),int(y))
    radius = int(radius)#取整
    img3 = cv.circle(img,center,radius,(0,255,0),2)
    cv.imshow("rectangle", img3)
    cv.waitKey(0) & 0xFF
    cv.destroyAllWindows()
    #拟合图像轮廓的最小闭合椭圆
    ellipse = cv.fitEllipse(cnt)
    img4 = cv.ellipse(img,ellipse,(0,255,0),2)
    cv.imshow("rectangle", img4)
    cv.waitKey(0) & 0xFF
    cv.destroyAllWindows()
    
    #program 7.轮廓属性的提取与运用
    import numpy as np
    import cv2 as cv 
    img = cv.imread("G:\sundries\CVpictures\practice1.jpg")
    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    img_gray = cv.Canny(img_gray, 100, 300)
    ret, thresh = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)
    contours, hierarchy = cv.findContours(thresh, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
    cnt = contours[0]
    x,y,w,h = cv.boundingRect(cnt)
    area = cv.contourArea(cnt)
    #求轮廓的长宽比
    aspect_ratio = float(w)/h
    print(aspect_ratio)
    #求轮廓的范围:轮廓区域与边界区域比值 
    rect_area = w*h
    extent = float(area)/rect_area
    print(extent)
    #求轮廓的坚实度:等高线面积与其凸包面积之比
    hull = cv.convexHull(cnt)
    hull_area = cv.contourArea(hull)
    solidity = float(area)/hull_area
    print(solidity)
    #求轮廓的等效直径:面积与轮廓面积相同的圆的直径
    equi_diameter = np.sqrt(4*area/np.pi)
    print(equi_diameter)
    #求轮廓的取向:物体指向的角度
    (x,y),(MA,ma),angle = cv.fitEllipse(cnt)
    #MA为主轴长度,ma为负轴长度
    print(MA)
    print(ma)
    print(angle)
    #找到构成对象的所有点
    mask = np.zeros(img_gray.shape,np.uint8)
    cv.drawContours(mask,[cnt],0,255,-1)
    pixelpoints = cv.findNonZero(mask)
    #可以用numpy的  pixelpoints = np.transpose(np.nonzero(mask)) 来替换这一句
    print(pixelpoints)
    #找到这些点的最大值,最小值和它们的位置
    min_val, max_val, min_loc, max_loc = cv.minMaxLoc(img_gray,mask = mask)
    print(min_val)
    print(max_val)
    print(min_loc)
    print(max_loc)
    
    #program 8.找到对象的平均颜色或灰值图像的平均强度
    import numpy as np
    import cv2 as cv 
    img = cv.imread("G:\sundries\CVpictures\practice1.jpg")
    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    img_gray = cv.Canny(img_gray, 100, 300)
    ret, thresh = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)
    contours, hierarchy = cv.findContours(thresh, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
    cnt = contours[0]
    mean_val = cv.mean(img,mask = mask)
    print(mean_val)
    
    #program 9.找到图像的极端点
    import numpy as np
    import cv2 as cv 
    img = cv.imread("G:\sundries\CVpictures\practice1.jpg")
    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    img_gray = cv.Canny(img_gray, 100, 300)
    ret, thresh = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)
    contours, hierarchy = cv.findContours(thresh, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
    cnt = contours[0]
    leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
    rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
    topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
    bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])
    print(leftmost,rightmost,topmost,bottommost)
    
    #program 10.修正凸性缺陷
    import numpy as np
    import cv2 as cv 
    img = cv.imread("G:\sundries\CVpictures\practice1.jpg")
    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    img_gray = cv.Canny(img_gray, 100, 300)
    contours, hierarchy = cv.findContours(thresh, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
    cnt = contours[0]
    ret, thresh = cv.threshold(cv.cvtColor(img.copy(), cv.COLOR_BGR2GRAY) , 127, 255, cv.THRESH_BINARY)
    black = cv.cvtColor(np.zeros((img.shape[1], img.shape[0]), dtype=np.uint8), cv.COLOR_GRAY2BGR)
    #参数cv2.RETR_EXTERNAL是获取最外层轮廓
    hull = cv.convexHull(cnt)
    cv.drawContours(black, [hull], -1, (0, 0, 255), 2)
    #修正凸性缺陷的轮廓区域
    cv.imshow("hull", black)
    cv.waitKey(0)
    cv.destroyAllWindows()
    
    #program 11.点多边形测试
    import numpy as np
    import cv2 as cv 
    img = cv.imread("G:\sundries\CVpictures\practice1.jpg")
    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    img_gray = cv.Canny(img_gray, 100, 300)
    ret, thresh = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY)
    contours, hierarchy = cv.findContours(thresh, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
    cnt = contours[0]
    dist = cv.pointPolygonTest(cnt,(50,50),True)
    '''
    第三个参数是measureDist。如果它是真的,它会找到有符号的距离
    如果为假,则查找该点是在轮廓线内部还是外部(分别返回+1、-1和0)
    如果不想找到距离,第三个参数为False,可使速度提高2-3倍
    ''''
    
    #program 12.形状匹配
    #cv.matchShapes(),比较两个形状或两个轮廓,并返回一个显示相似性的度量。结果越低,匹配越好。它是根据矩值计算出来的
    import cv2 as cv
    import numpy as np
    img1 = cv.imread('G:\sundries\CVpictures\stars1.jpg',0)
    img2 = cv.imread('G:\sundries\CVpictures\stars2.jpg',0)
    ret, thresh = cv.threshold(img1, 127, 255,0)
    ret, thresh2 = cv.threshold(img2, 127, 255,0)
    contours,hierarchy = cv.findContours(thresh,2,1)
    cnt1 = contours[0]
    contours,hierarchy = cv.findContours(thresh2,2,1)
    cnt2 = contours[0]
    ret = cv.matchShapes(cnt1,cnt2,1,0.0)
    print( ret )
    
    展开全文
  • python # 形状轮廓拟合 import cv2 import numpy as np im = cv2.imread('test2.jpg') imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) #转为 二值化图像 ret,thresh = cv2.threshold(imgray,...
  • OpenCV—椭圆拟合fitEllipse

    万次阅读 多人点赞 2017-10-26 21:32:09
    本文的主要参考为官方文档OpenCV249-fitEllipse和博客-opencv中的椭圆拟合 以及《Learning OpenCV 3》page424-425 OpenCV中提供的椭圆拟合API如下: RotatedRect fitEllipse(InputArray points)输入:二维点集,...

    本文的主要参考为官方文档OpenCV249-fitEllipse博客-opencv中的椭圆拟合

    以及《Learning OpenCV 3》page424-425

    OpenCV中提供的椭圆拟合API如下:

    RotatedRect fitEllipse(InputArray points)
    输入:二维点集, 要求拟合的点至少为6个点。存储在std::vector<> or Mat

    处理:该函数使用的是最小二乘的方法进行拟合的。参考论文:《Direct least square fitting of ellipses》

    输出:RotatedRect 类型的矩形,是拟合出椭圆的最小外接矩形。


    绘制椭圆用到的API如下,官方文档OpenCV249-ellipse

    void ellipse(Mat& img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
    void ellipse(Mat& img, const RotatedRect& box, const Scalar& color, int thickness=1, int lineType=8)
    对应的参数可参见下图:


    示例代码如下:

    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include <iostream>
    using namespace cv;
    using namespace std;
    
    int main( )
    {
    	const char* filename = "rect-45度.bmp";
    	Mat src_image = imread(filename, 0);
    	if( src_image.empty() )
    	{
    		cout << "Couldn't open image!" << filename;
    		return 0;
    	}
    
    	imshow("原图", src_image);
    	
    	//轮廓
    	vector<vector<Point>> contours;
    
    	//使用canny检测出边缘
    	Mat edge_image;
    	Canny(src_image,edge_image,30,70);
    	imshow("canny边缘",edge_image);
    
    	//边缘追踪,没有存储边缘的组织结构
    	findContours(edge_image, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
    	Mat cimage = Mat::zeros(edge_image.size(), CV_8UC3);
    
    	for(size_t i = 0; i < contours.size(); i++)
    	{
    		//拟合的点至少为6
    		size_t count = contours[i].size();
    		if( count < 6 )
    			continue;
    
    		//椭圆拟合
    		RotatedRect box = fitEllipse(contours[i]);
    
    		//如果长宽比大于30,则排除,不做拟合
    		if( MAX(box.size.width, box.size.height) > MIN(box.size.width, box.size.height)*30 )
    			continue;
    
    		//画出追踪出的轮廓
    		drawContours(cimage, contours, (int)i, Scalar::all(255), 1, 8);
    		
    		//画出拟合的椭圆
    		ellipse(cimage, box, Scalar(0,0,255), 1, CV_AA);
    	}
    	imshow("拟合结果", cimage);
    
    	waitKey();
    	return 0;
    }
    


    展开全文
  • OPENCV入门11.1如何使用11.2图像处理基本操作31.2.1读取图像31.2.2显示图像51.2.3保存图像91.3OpenCV贡献库10第2章图像处理基础112.1图像的基本表示方法112.2像素处理152.3使用numpy.array访问像素232.4感兴趣区域...

    章OPENCV入门1

    1.1如何使用1

    1.2图像处理基本操作3

    1.2.1读取图像3

    1.2.2显示图像5

    1.2.3保存图像9

    1.3OpenCV贡献库10

    第2章图像处理基础11

    2.1图像的基本表示方法11

    2.2像素处理15

    2.3使用numpy.array访问像素23

    2.4感兴趣区域(ROI)29

    2.5通道操作32

    2.5.1通道拆分32

    2.5.2通道合并34

    2.6获取图像属性36

    第3章图像运算37

    3.1图像加法运算37

    3.1.1加号运算符37

    3.1.2cv2.add()函数38

    3.2图像加权和40

    3.3按位逻辑运算43

    3.3.1按位与运算43

    3.3.2按位或运算46

    3.3.3按位非运算47

    3.3.4按位异或运算48

    3.4掩模49

    3.5图像与数值的运算52

    3.6位平面分解53

    3.7图像加密和解密59

    3.8数字水印63

    3.8.1原理64

    3.8.2实现方法66

    3.8.3例题73

    3.9脸部打码及解码74

    第4章色彩空间类型转换77

    4.1色彩空间基础77

    4.1.1GRAY色彩空间77

    4.1.2XYZ色彩空间78

    4.1.3YCrCb色彩空间78

    4.1.4HSV色彩空间79

    4.1.5HLS色彩空间80

    4.1.6CIEL*a*b*色彩空间80

    4.1.7CIEL*u*v*色彩空间81

    4.1.8Bayer色彩空间82

    4.2类型转换函数82

    4.3类型转换实例88

    4.3.1通过数组观察转换效果88

    4.3.2图像处理实例92

    4.4HSV色彩空间讨论93

    4.4.1基础知识93

    4.4.2获取指定颜色95

    4.4.3标记指定颜色96

    4.4.4标记肤色100

    4.4.5实现艺术效果101

    4.5alpha通道102

    第5章几何变换106

    5.1缩放106

    5.2翻转110

    5.3仿射111

    5.3.1平移112

    5.3.2旋转113

    5.3.3更复杂的仿射变换114

    5.4透视115

    5.5重映射117

    5.5.1映射参数的理解117

    5.5.2复制119

    5.5.3绕x轴翻转121

    5.5.4绕y轴翻转122

    5.5.5绕x轴、y轴翻转124

    5.5.6x轴、y轴互换126

    5.5.7图像缩放128

    第6章阈值处理130

    6.1threshold函数130

    6.1.1二值化阈值处理(cv2.THRESH_BINARY)131

    6.1.2反二值化阈值处理(cv2.THRESH_BINARY_INV)133

    6.1.3截断阈值化处理(cv2.THRESH_TRUNC)135

    6.1.4超阈值零处理(cv2.THRESH_TOZERO_INV)136

    6.1.5低阈值零处理(cv2.THRESH_TOZERO)138

    6.2自适应阈值处理139

    6.3Otsu处理141

    第7章图像平滑处理144

    7.1均值滤波146

    7.1.1基本原理146

    7.1.2函数语法150

    7.1.3程序示例150

    7.2方框滤波152

    7.2.1基本原理152

    7.2.2函数语法153

    7.2.3程序示例154

    7.3高斯滤波156

    7.3.1基本原理156

    7.3.2函数语法158

    7.3.3程序示例159

    7.4中值滤波159

    7.4.1基本原理160

    7.4.2函数语法161

    7.4.3程序示例161

    7.5双边滤波162

    7.5.1基本原理162

    7.5.2函数语法164

    7.5.3程序示例164

    7.62D卷积166

    第8章形态学操作168

    8.1腐蚀168

    8.2膨胀173

    8.3通用形态学函数178

    8.4开运算179

    8.5闭运算180

    8.6形态学梯度运算182

    8.7礼帽运算183

    8.8黑帽运算185

    8.9核函数186

    第9章图像梯度189

    9.1Sobel理论基础189

    9.2Sobel算子及函数使用191

    9.2.1参数ddepth192

    9.2.2方向195

    9.2.3实例196

    9.3Scharr算子及函数使用200

    9.4Sobel算子和Scharr算子的比较204

    9.5Laplacian算子及函数使用206

    9.6算子总结208

    0章CANNY边缘检测209

    10.1Canny边缘检测基础209

    10.2Canny函数及使用213

    1章图像金字塔215

    11.1理论基础215

    11.2pyrDown函数及使用217

    11.3pyrUp函数及使用219

    11.4采样可逆性的研究220

    11.5拉普拉斯金字塔223

    11.5.1定义223

    11.5.2应用225

    2章图像轮廓229

    12.1查找并绘制轮廓229

    12.1.1查找图像轮廓:findContours函数229

    12.1.2绘制图像轮廓:drawContours函数237

    12.1.3轮廓实例238

    12.2矩特征240

    12.2.1矩的计算:moments函数241

    12.2.2计算轮廓的面积:contourArea函数243

    12.2.3计算轮廓的长度:arcLength函数246

    12.3Hu矩248

    12.3.1Hu矩函数248

    12.3.2形状匹配252

    12.4轮廓拟合254

    12.4.1矩形包围框254

    12.4.2最小包围矩形框257

    12.4.3最小包围圆形259

    12.4.4最优拟合椭圆260

    12.4.5最优拟合直线261

    12.4.6最小外包三角形262

    12.4.7逼近多边形263

    12.5凸包266

    12.5.1获取凸包267

    12.5.2凸缺陷268

    12.5.3几何学测试270

    12.6利用形状场景算法比较轮廓275

    12.6.1计算形状场景距离275

    12.6.2计算Hausdorff距离278

    12.7轮廓的特征值280

    12.7.1宽高比280

    12.7.2Extent281

    12.7.3Solidity282

    12.7.4等效直径(EquivalentDiameter)283

    12.7.5方向284

    12.7.6掩模和像素点286

    12.7.7优选值和最小值及它们的位置291

    12.7.8平均颜色及平均灰度293

    12.7.9极点294

    3章直方图处理297

    13.1直方图的含义297

    13.2绘制直方图301

    13.2.1使用Numpy绘制直方图301

    13.2.2使用OpenCV绘制直方图302

    13.2.3使用掩模绘制直方图307

    13.3直方图均衡化312

    13.3.1直方图均衡化原理313

    13.3.2直方图均衡化处理317

    13.4pyplot模块介绍319

    13.4.1subplot函数319

    13.4.2imshow函数320

    4章傅里叶变换324

    14.1理论基础324

    14.2Numpy实现傅里叶变换328

    14.2.1实现傅里叶变换329

    14.2.2实现逆傅里叶变换330

    14.2.3高通滤波示例331

    14.3OpenCV实现傅里叶变换333

    14.3.1实现傅里叶变换333

    14.3.2实现逆傅里叶变换335

    14.3.3低通滤波示例336

    5章模板匹配339

    15.1模板匹配基础339

    15.2多模板匹配345

    6章霍夫变换351

    16.1霍夫直线变换351

    16.1.1霍夫变换原理351

    16.1.2HoughLines函数357

    16.1.3HoughLinesP函数359

    16.2霍夫圆环变换361

    7章图像分割与提取364

    17.1用分水岭算法实现图像分割与提取364

    17.1.1算法原理364

    17.1.2相关函数介绍366

    17.1.3分水岭算法图像分割实例375

    17.2交互式前景提取376

    8章视频处理383

    18.1VideoCapture类383

    18.1.1类函数介绍383

    18.1.2捕获摄像头视频387

    18.1.3播放视频文件388

    18.2VideoWriter类389

    18.2.1类函数介绍389

    18.2.2保存视频391

    18.3视频操作基础392

    9章绘图及交互393

    19.1绘画基础393

    19.1.1绘制直线394

    19.1.2绘制矩形394

    19.1.3绘制圆形395

    19.1.4绘制椭圆397

    19.1.5绘制多边形398

    19.1.6在图形上绘制文字400

    19.2鼠标交互402

    19.2.1简单示例404

    19.2.2进阶示例405

    19.3滚动条407

    19.3.1用滚动条实现调色板408

    19.3.2用滚动条控制阈值处理参数409

    19.3.3用滚动条作为开关410

    第20章K近邻算法412

    20.1理论基础412

    20.2计算415

    20.2.1归一化415

    20.2.2距离计算416

    20.2手写数字识别的原理417

    20.3自定义函数手写数字识别421

    20.4K近邻模块的基本使用427

    20.5K近邻手写数字识别429

    第21章支持向量机431

    21.1理论基础431

    21.2SVM案例介绍434

    第22章K均值聚类439

    22.1理论基础439

    22.1.1分豆子439

    22.1.2K均值聚类的基本步骤441

    22.2K均值聚类模块441

    22.3简单示例442

    第23章人脸识别448

    23.1人脸检测448

    23.1.1基本原理448

    23.1.2级联分类器的使用451

    23.1.3函数介绍452

    23.1.4案例介绍453

    23.2LBPH人脸识别454

    23.2.1基本原理454

    23.2.2函数介绍456

    23.2.3案例介绍457

    23.3EigenFaces人脸识别458

    23.3.1基本原理458

    23.3.2函数介绍459

    23.3.3案例介绍460

    23.4Fisherfaces人脸识别461

    23.4.1基本原理461

    23.4.2函数介绍463

    23.4.3案例介绍464

    23.5人脸数据库465

    参与文献467

    附录A范例470显示全部>>隐藏全部>>

    展开全文
  • 第1章 OPENCV入门11.1 如何使用11.2 图像处理基本操作31.2.1 读取图像31.2.2 显示图像51.2.3 保存图像91.3 OpenCV贡献库10第2章 图像处理基础112.1 图像的基本表示方法112.2 像素处理152.3 使用numpy.array访问像素...
  • opencv python 常用方法

    千次阅读 多人点赞 2020-09-11 16:42:35
    点击:OpenCV--Python 基本使用 一、基本方法 1、cv2.imread() 读入图像;第一个参数为图像路径;第二个为cv2.IMREAD_COLOR:读入彩色图像;cv2.IMREAD_GRAYSCALE:读入灰度图像。 import cv2 import matplotlib....
  • OpenCV python 轮廓(连通域)外接正矩形

    千次阅读 2020-01-08 12:29:40
    OpenCV python 轮廓(连通域)外接正矩形 import cv2 import numpy as np def get_contour(img): """获取连通域 :param img: 输入图片 :return: 最大连通域 """ # 灰度化, 二值化, 连通域分析 img_gray = cv...
  • OpenCV Python开发 第一章 图像处理基础 不同的色彩空间 色彩是人的眼睛对于不同频率的光线的不同感受, 色彩既是客观存在的(不同频率的光)又是主观感知的, 有认识差异. “色彩空间”一词源于西方的“Color Space”, ...
  • 任务:给定这样一张图片求图片中白色区域的外接矩形、最小外接矩形拟合多边形以及外接圆 外接矩形 x, y, w, h = cv2.boundingRect(points) 输入:点集 返回值:左上角点坐标以及宽高 实现代码: import cv2 ...
  • OpencV使用fitEllipse拟合椭圆后,获取椭圆参数

    万次阅读 热门讨论 2017-07-14 12:04:15
    使用OpenCV的fitEllipse函数拟合椭圆后,会得到一个RotatedRect类型的返还值,首先介绍一下RotatedRect结构,这个参考的无左无右的博客:点击打开链接,嫌左右跳麻烦,所以直接贴过来   class CV_EXPORTS ...
  • 使用OpenCVPython查找图片差异flyfish方法1 均方误差的算法(Mean Squared Error , MSE)下面的一些表达与《TensorFlow - 协方差矩阵》式子表达式一样的拟合 误差平方和( sum of squared errors)residual sum of...
  • 2 多边形拟合 approxPolyDP contour epsilon 越小,折现越逼近真实形状 close:是否为闭合区域 3 几何矩的计算 4 算面积 import cv2 as cv import numpy as np def measure_demo ( ...
  • retval = cv.fitEllipse(contours[1]) # 取其中一个轮廓拟合椭圆 img = cv.ellipse(im, retval, (0, 0, 255), thickness=2) # 在原图画椭圆 cv.imshow("mark_ellipse[1]", img) print(retval) # 这里可以查看下...
  • 目录前言绘制椭圆的矩形边界最小包围矩形框最小包围圆形框最优拟合椭圆最优拟合直线最小外包三角形逼近多边形 前言 在计算轮廓时,可能并不需要实际的轮廓,而仅需要一个接近于轮廓的近似多边形。比如矩形其实都是...
  • cnts = contours[0] if imutils.is_cv2() else contours[1] #用imutils来判断是opencv是2还是2+ for cnt in cnts: # 外接矩形框,没有方向角 x, y, w, h = cv2.boundingRect(cnt) cv2.rectangle(im, (x, y), (x ...
  • 利用图片中离散的点,利用轮廓识别、多列表排序、多项式拟合等方法,拟合出两条车道线。
  • 函数cv2.boundingRect返回四个参数(x,y)为矩形左上角的坐标,(w,h)是矩形的宽和高。 函数cv2.rectangle是绘制矩形函数 函数cv2.minAreaRect返回的是一个 Box2D 结构,其中包含 矩形左上角角点的坐标(x,y...
  • 边界矩形 最小外接圆 椭圆拟合 直线拟合 轮廓性质 综合举例 轮廓形状拟合 1 边界矩形 1.1 直边界矩形 一个直矩形(就是没有旋转的矩形)。它不会考虑对象是否旋转。 所以边界矩形的面积不是最小的。可以...
  • opencv 直线拟合

    万次阅读 多人点赞 2018-04-18 15:12:13
    一、话说直线拟合霍夫直线检测容易受到线段形状与噪声的干扰而失真,这个时候我们需要另辟蹊径,通过对图像进行二值分析,提取骨架,对骨架像素点拟合生成直线,这种做法在一些场景下非常有效,而且效果还比较好。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 856
精华内容 342
关键字:

opencvpython矩形拟合

python 订阅