透视变换

import cv2
import numpy as np

src_points = np.array([(435,465), (1210,465), (195,885), (1520,885)], dtype="float32") # 原图坐标1
# dst_points = np.array([[0., 0.], [800., 0.], [0., 800.], [800., 800.]], dtype="float32") # 变换后这四个点对应的坐标
dst_points = np.array([[50., 50.], [750., 50.], [50., 750.], [750., 750.]], dtype="float32") # 变换后这四个点对应的坐标

M = cv2.getPerspectiveTransform(src_points, dst_points) # 得到透视变换矩阵

image = cv2.imread('d:/dataset/video/image.jpg')
image_dst = cv2.warpPerspective(image, M, (800, 800), cv2.INTER_LINEAR) # 将整个image应用透视变换,输出(800,,800)大小的图片

# 在变换后的图上画点
cv2.circle(image_dst, (50, 50), 5, (0, 0, 255), -1)
cv2.circle(image_dst, (750, 50), 5, (0, 0, 255), -1)
cv2.circle(image_dst, (50, 750), 5, (0, 0, 255), -1)
cv2.circle(image_dst, (750, 750), 5, (0, 0, 255), -1)
cv2.rectangle(image_dst, (50, 50), (750, 750), (0, 255, 0), 3, cv2.LINE_4) # 左上,右下的坐标画矩形

# 在原图上画点
cv2.circle(image, (435,465), 5, (0, 0, 255), -1)
cv2.circle(image, (1210,465), 5, (0, 0, 255), -1)
cv2.circle(image, (195,885), 5, (0, 0, 255), -1)
cv2.circle(image, (1520,885), 5, (0, 0, 255), -1)
pts = np.array([[435,465], [1210,465], [1520,885],[195,885]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(image, [pts], True, (0, 255, 255), 3)


cv2.imshow("image1", image)
cv2.imshow('image2',image_dst)
cv2.waitKey()
cv2.imwrite("d:/dataset/video/image1.jpg", image)
cv2.imwrite('d:/dataset/video/image2.jpg',image_dst)

 

原图:

  

透视变换后:

 

c++代码: 

// 得到透视变换矩阵
std::vector<cv::Point2f> srcPoints = { {1256,370},{2457,600},{10,737},{2173,1532} }; //4个标记点在原图中的坐标
std::vector<cv::Point2f> dstPoints = { {50,50},{750,50},{50,750},{750,750} }; // 4个标记点在变换图中的坐标
cv::Mat persctiveMatrix = getPerspectiveTransform(srcPoints, dstPoints);

// 进行透视变换
cv::perspectiveTransform(points, transPoints, persctiveMatrix);

 

posted @ 2022-10-12 13:41  cheng4632  阅读(35)  评论(0编辑  收藏  举报