Python opencv画像矯正——透視変換

1556 ワード

透視ベースの画像矯正
  • 画像の4つの頂点
  • を取得する.
  • は、変換マトリクス
  • を形成する.
  • パース変換
  • from imutils.perspective import four_point_transform
    import imutils
    import cv2
    
    
    def Get_Outline(input_dir):
        image = cv2.imread(input_dir)
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        blurred = cv2.GaussianBlur(gray, (5, 5), 0)
        edged = cv2.Canny(blurred, 75, 200)
        return image, gray, edged
    
    
    def Get_cnt(edged):  #           
        cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        cnts = cnts[0] if imutils.is_cv2() else cnts[1]
        docCnt = None
    
        if len(cnts) > 0:
            cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
            for c in cnts:
                peri = cv2.arcLength(c, True)  #          
                approx = cv2.approxPolyDP(c, 0.02 * peri, True)  #        
                if len(approx) == 4:  #          
                    docCnt = approx
                    break
        return docCnt
    
    
    if __name__ == "__main__":
        input_dir = "21.png"
        image, gray, edged = Get_Outline(input_dir)
        docCnt = Get_cnt(edged)  #    
        result_img = four_point_transform(image, docCnt.reshape(4, 2))  #              
        print(docCnt)
        #      
        for peak in docCnt:
            peak = peak[0]
            cv2.circle(image, tuple(peak), 10, (255, 0, 0))
            
        cv2.imshow("original", image)
        cv2.imshow("gray", gray)
        cv2.imshow("edged", edged)
        cv2.imshow("result_img", result_img)
    
        cv2.waitKey(0)
        cv2.destroyAllWindows()