0
点赞
收藏
分享

微信扫一扫

传统目标检测方法步骤记录

月孛星君 2022-04-14 阅读 45
python

传统目标检测方法步骤记录

# # https://blog.csdn.net/mao_hui_fei/article/details/115132222
# #(基于透视的图像矫正)
import cv2
import math
import numpy as np

def Img_Outline(input_dir):
    original_img = cv2.imread(input_dir)
    gray_img = cv2.cvtColor(original_img, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray_img, (5, 5), 0)                     # 高斯模糊去噪(设定卷积核大小影响效果)
    # _, RedThresh = cv2.threshold(blurred, 165, 255, cv2.THRESH_BINARY)  # 设定阈值165(阈值影响开闭运算效果)
    
    # _, RedThresh = cv2.threshold(blurred, 50, 255, 0) # 能运行
    _, RedThresh = cv2.threshold(blurred, 50, 255, 0) # 效果很好。。。
    # https://blog.csdn.net/JNingWei/article/details/77747959


    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))          # 定义矩形结构元素
    closed = cv2.morphologyEx(RedThresh, cv2.MORPH_CLOSE, kernel)       # 闭运算(链接块)
    opened = cv2.morphologyEx(closed, cv2.MORPH_OPEN, kernel)           # 开运算(去噪点)
    return original_img, gray_img, RedThresh, closed, opened


def findContours_img(original_img, opened):
    contours, hierarchy = cv2.findContours(opened, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
    c = sorted(contours, key=cv2.contourArea, reverse=True)[1]   # 计算最大轮廓的旋转包围盒
    rect = cv2.minAreaRect(c)                                    # 获取包围盒(中心点,宽高,旋转角度)
    box = np.int0(cv2.boxPoints(rect))                           # box
    draw_img = cv2.drawContours(original_img.copy(), [box], -1, (0, 0, 255), 50)

    print("box[0]:", box[0])
    print("box[1]:", box[1])
    print("box[2]:", box[2])
    print("box[3]:", box[3])
    return box,draw_img

def Perspective_transform(box,original_img):
    # 获取画框宽高(x=orignal_W,y=orignal_H)
    orignal_W = math.ceil(np.sqrt((box[3][1] - box[2][1])**2 + (box[3][0] - box[2][0])**2))
    orignal_H= math.ceil(np.sqrt((box[3][1] - box[0][1])**2 + (box[3][0] - box[0][0])**2))

    # 原图中的四个顶点,与变换矩阵
    pts1 = np.float32([box[0], box[1], box[2], box[3]])
    pts2 = np.float32([[int(orignal_W+1),int(orignal_H+1)], [0, int(orignal_H+1)], [0, 0], [int(orignal_W+1), 0]])

    # 生成透视变换矩阵;进行透视变换
    M = cv2.getPerspectiveTransform(pts1, pts2)
    result_img = cv2.warpPerspective(original_img, M, (int(orignal_W+3),int(orignal_H+1)))

    return result_img

if __name__=="__main__":
    # input_dir = "./ori/4.png" # 光线过强的情况,识别不全
    # input_dir = "./ori/6.png" # 能正确识别出来的
    input_dir = "./ori/11.png" 
    original_img, gray_img, RedThresh, closed, opened = Img_Outline(input_dir)
    box, draw_img = findContours_img(original_img,opened)
    result_img = Perspective_transform(box,original_img)
    name_im = '_11'
    cv2.imwrite('result_img'+name_im+'.png', result_img)
    cv2.imwrite('draw_img'+name_im+'.png', draw_img)
    cv2.imwrite('gray'+name_im+'.png', gray_img)
    cv2.imwrite('closed'+name_im+'.png', closed)
    cv2.imwrite('opened'+name_im+'.png', opened)

    cv2.namedWindow('original',cv2.WINDOW_NORMAL)
    cv2.namedWindow('gray',cv2.WINDOW_NORMAL)
    cv2.namedWindow('closed',cv2.WINDOW_NORMAL)
    cv2.namedWindow('opened',cv2.WINDOW_NORMAL)
    cv2.namedWindow('draw_img',cv2.WINDOW_NORMAL)
    cv2.namedWindow('result_img',cv2.WINDOW_NORMAL)
    cv2.imshow("original", original_img)
    cv2.imshow("gray", gray_img)
    cv2.imshow("closed", closed)
    cv2.imshow("opened", opened)
    cv2.imshow("draw_img", draw_img)
    cv2.imshow("result_img", result_img)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

举报

相关推荐

0 条评论