From 08d577da93bb0fd6b65eea13922b0c62571be89b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Python=E5=B0=8F=E7=99=BD=E8=BF=9B=E9=98=B6?= <860365566@qq.com> Date: Sun, 12 Dec 2021 15:56:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=B0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Affine1.md" | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 "data/1.OpenCV\345\210\235\351\230\266/4.\345\207\240\344\275\225\345\217\230\346\215\242\345\222\214\345\233\276\345\203\217\347\211\271\345\276\201/1.\344\273\277\345\260\204\345\217\230\346\215\242/Affine1.md" diff --git "a/data/1.OpenCV\345\210\235\351\230\266/4.\345\207\240\344\275\225\345\217\230\346\215\242\345\222\214\345\233\276\345\203\217\347\211\271\345\276\201/1.\344\273\277\345\260\204\345\217\230\346\215\242/Affine1.md" "b/data/1.OpenCV\345\210\235\351\230\266/4.\345\207\240\344\275\225\345\217\230\346\215\242\345\222\214\345\233\276\345\203\217\347\211\271\345\276\201/1.\344\273\277\345\260\204\345\217\230\346\215\242/Affine1.md" new file mode 100644 index 0000000..2a71296 --- /dev/null +++ "b/data/1.OpenCV\345\210\235\351\230\266/4.\345\207\240\344\275\225\345\217\230\346\215\242\345\222\214\345\233\276\345\203\217\347\211\271\345\276\201/1.\344\273\277\345\260\204\345\217\230\346\215\242/Affine1.md" @@ -0,0 +1,95 @@ +# 仿射变换 + +几何变换是指对对图像的位置、大小、形状、投影进行变换,是将图像从原始平面投影到新的视平面。仿射变换(Affine)的特点是原始图像中的平行关系和线段长度比例关系保持不变。 + +仿射变换矩阵中有 6 个未知参数,cv2.getAffineTransform() 根据图像中不共线的 3 个点在变换前后的对应位置坐标,求出仿射变换矩阵。cv2.warpAffine() 通过变换矩阵计算得到变换后的图像。 + +**函数说明:** + +``` +cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst +``` + +旋转也是一种简单仿射变换,我们用变换矩阵将下面的色块图旋转一下,看看会产生什么样的效果吧。 + +![](./affine2.png) + +下面对仿射变换实现代码正确的是? + +## 答案 + +``` +import cv2 as cv +import numpy as np + +if __name__ == '__main__': + img = cv.imread("affine1.jpg") + + pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) + pts2 = np.float32([[50, 100], [200, 50], [100, 250]]) + MA = cv.getAffineTransform(pts1, pts2) + dst = cv.warpAffine(img, MA, img.shape[:2]) + + cv.imshow("Origin image", img) + cv.imshow("Affine transform", dst) + cv.waitKey(0) +``` + +## 选项 + +### 需要 3个给定点变换前后的位置才能计算变换矩阵 + +``` +import cv2 as cv +import numpy as np + +if __name__ == '__main__': + img = cv.imread("affine1.jpg") + + pts1 = np.float32([[50, 50], [200, 50]]) + pts2 = np.float32([[50, 100], [200, 50]]) + MA = cv.getAffineTransform(pts1, pts2) + dst = cv.warpAffine(img, MA, img.shape[:2]) + + cv.imshow("Origin image", img) + cv.imshow("Affine transform", dst) + cv.waitKey(0) +``` + +### 函数 cv.getAffineTransform() 缺少给定点变换后的位置 + +``` +import cv2 as cv +import numpy as np + +if __name__ == '__main__': + img = cv.imread("affine1.jpg") # 读取彩色图像(BGR) + + pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) + MA = cv.getAffineTransform(pts1) + dst = cv.warpAffine(img, MA, img.shape[:2]) + + cv.imshow("Origin image", img) + cv.imshow("Affine transform", dst) + cv.waitKey(0) + +``` + +### 函数 cv.warpAffine() 缺少参数:图像大小 dsize + +``` +import cv2 as cv +import numpy as np + +if __name__ == '__main__': + img = cv.imread("affine1.jpg") # 读取彩色图像(BGR) + + pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) + pts2 = np.float32([[50, 100], [200, 50], [100, 250]]) + MA = cv.getAffineTransform(pts1, pts2) + dst = cv.warpAffine(img, MA) + + cv.imshow("Origin image", img) + cv.imshow("Affine transform", dst) + cv.waitKey(0) +``` -- GitLab