python opencv 找到圆点标定板所有点后通过距离找四个角点

  • Post author:
  • Post category:python


整个计算是图像被放大计算的

图像大小是640*480,所以有一个计算(640,0)之间的距离,如果图像大小变化要调整

h, w = image.shape[:2]

将640替换为w

原图

# coding:utf-8
import math

import cv2
import numpy as np
import matplotlib.pyplot as plt


def mainFigure(img):
    w = 20
    h = 5
    params = cv2.SimpleBlobDetector_Params()
    # Setup SimpleBlobDetector parameters.
    # print('params')
    # print(params)
    # print(type(params))


    # Filter by Area.
    params.filterByArea = True
    params.minArea = 10e1
    params.maxArea = 10e3
    params.minDistBetweenBlobs = 25
    # params.filterByColor = True
    params.filterByConvexity = False
    # tweak these as you see fit
    # Filter by Circularity
    # params.filterByCircularity = False
    # params.minCircularity = 0.2
    # params.blobColor = 0
    # # # Filter by Convexity
    # params.filterByConvexity = True
    # params.minConvexity = 0.87
    # Filter by Inertia
    # params.filterByInertia = True
    # params.filterByInertia = False
    # params.minInertiaRatio = 0.01


    gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # Detect blobs.
    # image = cv2.resize(gray_img, (int(img.shape[1]/4),int(img.shape[0]/4)), 1, 1, cv2.INTER_LINEAR)
    # image = cv2.resize(gray_img, dsize=None, fx=0.25, fy=0.25, interpolation=cv2.INTER_LINEAR)
    minThreshValue = 120
    _, gray = cv2.threshold(gray, minThreshValue, 255, cv2.THRESH_BINARY)
    gray = cv2.resize(gray, dsize=None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR)
    # plt.imshow(gray)
    # cv2.imshow("gray",gray)

    # 找到距离原点(0,0)最近和最远的点

    detector = cv2.SimpleBlobDetector_create(params)
    keypoints = detector.detect(gray)
    # opencv
    im_with_keypoints = cv2.drawKeypoints(gray, keypoints, np.array([]), (255, 0, 0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    # plt
    # fig = plt.figure()
    # im_with_keypoints = cv2.drawKeypoints(gray, keypoints, np.array([]), (0, 0, 255),  cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    color_img = cv2.cvtColor(im_with_keypoints, cv2.COLOR_BGR2RGB)

    if keypoints is not None:
        kpUpLeft = []
        disUpLeft = []
        for i in range(len(keypoints)):
            dis = math.sqrt(math.pow(keypoints[i].pt[0],2) + math.pow(keypoints[i].pt[1],2))
            disUpLeft.append(dis)
            kpUpLeft.append(keypoints[i].pt)
        disDownRightIndex = disUpLeft.index(max(disUpLeft))
        pointDR = kpUpLeft[disDownRightIndex]

        disUpLeftIndex = disUpLeft.index(min(disUpLeft))
        pointUL = kpUpLeft[disUpLeftIndex]

        # print("minIndex", disUpLeftIndex)
        # print("maxIndex", disDownRightIndex)
        # print("min", pointUL)
        # print("max", pointDR)

        # 找到距离(640*2,0)最近和最远的点
        kpUpRight = []
        disUpRight=[]
        for i in range(len(keypoints)):
            # 最大距离坐标
            dis2 = math.sqrt(math.pow(abs(keypoints[i].pt[0]-640*2),2) + math.pow(abs(keypoints[i].pt[1]),2))
            disUpRight.append(dis2)
            kpUpRight.append(keypoints[i].pt)

        disDownLeftIndex = disUpRight.index(max(disUpRight))
        pointDL = kpUpRight[disDownLeftIndex]

        disUpRightIndex = disUpRight.index(min(disUpRight))
        pointUR = kpUpLeft[disUpRightIndex]

        # print(pointUR[0])
        # print(pointUR[1])

        # print("minIndex", disUpRightIndex)
        # print("maxIndex", disDownLeftIndex)
        # print("min", pointUR)
        # print("max", pointDL)

        if (pointDR is not None) and (pointUL is not None) and (pointDL is not None) and (pointUR is not None):
            cv2.circle(color_img, (int(pointDR[0]),int(pointDR[1])), 30, (0, 255, 0),2)
            cv2.circle(color_img, (int(pointUL[0]),int(pointUL[1])), 30, (0, 255, 0),2)
            cv2.line(color_img,(int(pointDR[0]),int(pointDR[1])), (int(pointDL[0]),int(pointDL[1])),(0, 0, 255),2)

            cv2.circle(color_img, (int(pointDL[0]),int(pointDL[1])), 30, (0, 255, 0),2)
            cv2.circle(color_img, (int(pointUR[0]),int(pointUR[1])), 30, (0, 255, 0),2)
            cv2.line(color_img, (int(pointDL[0]),int(pointDL[1])), (int(pointUR[0]),int(pointUR[1])), (0, 0, 255), 2)
            cv2.line(color_img, (int(pointUL[0]),int(pointUL[1])), (int(pointUR[0]),int(pointUR[1])), (0, 0, 255), 2)


    # plt.imshow(color_img,interpolation='bicubic')
    # fname = "key points"
    # titlestr = '%s found %d keypoints' % (fname, len(keypoints))
    # plt.title(titlestr)
    # fig.canvas.set_window_title(titlestr)
    # plt.show()

    cv2.imshow('findCorners', color_img)
    cv2.waitKey()




if __name__ == "__main__":

    # 图片测试
    # # img = cv2.imread("circles/circels.jpg",1)
    img = cv2.imread("circles/Snap_001.jpg",1)
    mainFigure(img)


  



版权声明:本文为moonlightpeng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。