neozhaoliang / surround-view-system-introduction

A full Python implementation for real car surround view system
MIT License
871 stars 307 forks source link

鳥視圖問題 #10

Closed 87091988 closed 4 years ago

87091988 commented 4 years ago

請問如何讓一張照片透過點4個點就把整個畫面變成鳥視圖?在沒有變形的情況下,謝謝您

neozhaoliang commented 4 years ago

第一步指定原图上的四个像素在变换后的图像中的位置,然后用 cv2.getPerspectiveTransform 进行计算,得到一个 3x3 矩阵 M。 第二步用 cv2.warpPerspective 和 M 把原图变换。

87091988 commented 4 years ago

你好!下面我練習的範例,下面可以把圖片中A4紙張變成鳥視圖,但是想要辦到如何將整圖變成鳥視圖。找了很多都是圖片部分邊鳥視圖的。感謝您的幫忙。 希望達到像您圖片 Screenshot of 一份简单的车辆环视全景系统实现 - 朝花夕拾 這樣子 我找了CSND和google都沒有找到案例,希望哥可以以此例子照片新增範例到專案中謝謝!

coding: utf-8

import cv2 import matplotlib.pyplot as plt import numpy as np img = cv2.imread('sudokusmall.jpg') rows,cols,ch = img.shape

左图中画面中的点的坐标 四个

pts1 = np.float32([[958,615],[643,2636],[3744,2630],[3367,895]])

变换到新图片中,四个点对应的新的坐标 一一对应

pts2 = np.float32([[0,0],[0,500],[700,500],[700,0]])

生成变换矩阵

M = cv2.getPerspectiveTransform(pts1,pts2)

进行透视变换

dst = cv2.warpPerspective(img,M,(700,500)) cv2.imwrite("OUT.jpeg",dst)##另存新檔案 cv2.imshow("test",dst)##窗口顯示影像 cv2.waitKey(0)##等待直到用戶按下任意按鍵,注意有點視窗才會有反應 cv2.destroyWindow("test") sudokusmall

87091988 commented 4 years ago

@neozhaoliang

neozhaoliang commented 4 years ago

我试了一下,你的代码没有什么问题。

你指的是整张图片,没有像素的损失,完整的被变换成一张鸟瞰图吗?如果是那样的话,还想保持视野不变,这一般是做不到的。除非放大图片,那样中间就会出现黑色的空白部分。

你想象一下,两个人从不同的角度看一个场景,他俩看到的部分肯定是有不一致的。肯定有些部分一个人能看到而另一个人看不到。图片的透视变换本质就是一个场景从不同的角度去看它。所以鸟瞰图里面肯定会损失一部分像素。

感觉你是港台或者东南亚那边的朋友哎。

87091988 commented 4 years ago

@neozhaoliang 可以出現黑色部分,就如同你做的那個一樣,請問有案例嗎?我更改上面程式中的dst = cv2.warpPerspective(img,M,(700,500)) 500和700只是改變了A4的鳥視圖的顯示大小,無法變成整張圖的,如果可以在拜託你一下!我給我一個範例謝謝,我是台灣學生.

neozhaoliang commented 4 years ago

你可以把图片范围放大,比如这样:(四边各自加了 400 像素)

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

img = cv2.imread('111.jpg')
rows,cols,ch = img.shape
pts1 = np.float32([[958,615],[643,2636],[3744,2630],[3367,895]])
pts2 = np.float32([[400,400],[400,900],[1100,900],[1100,400]])
M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(img,M,(1500,1300))
cv2.imwrite("OUT.jpeg",dst)
cv2.imshow("test",dst)
cv2.waitKey(0)
cv2.destroyWindow("test")

result

87091988 commented 4 years ago

太謝謝您了!因為我微信無法使用打賞功能,稍後請朋友代替,請您喝一杯咖啡這樣謝謝您!我找了很久就是要這個效果!

neozhaoliang commented 4 years ago

不用客气,也不用麻烦打赏,心意已收到。

87091988 commented 4 years ago

不用客氣!!謝謝您幫了大忙。

neozhaoliang commented 4 years ago

打赏收到,谢谢。