gpt4 book ai didi

python - 如何在opencv python中将相机 View 转换为俯视笛卡尔平面?

转载 作者:行者123 更新时间:2023-12-02 17:21:22 25 4
gpt4 key购买 nike

我有一个从某个角度来自相机的视频流,我想要一个框架的顶 View ,但只针对一个移动点。图像不一定被包裹或拉伸(stretch)。
我想要的只是将指针范围从原始图像映射到笛卡尔平面(顶 View )
请参阅下面的图片。

到目前为止的代码

import cv2
import numpy as np
ix = 0
iy = 0


def draw_circle(event, x, y, flags, param):
global ix, iy
if event == cv2.EVENT_MOUSEMOVE:
ix = x
iy = y


img = cv2.imread("./maxresdefault.jpg")
h, w, c = img.shape
ones = np.zeros((h, w))
left, top = 50, 50
right, bottom = w - 50, h - 50
cv2.namedWindow('main_image')
while True:
ones_copy = ones.copy()
cv2.setMouseCallback('main_image', draw_circle)
cv2.rectangle(ones, (left, top), (right, bottom), (255, 255, 255), 2)
cv2.circle(ones_copy, (ix, iy), 2, (255, 255, 255), 2)
cv2.imshow("main_image", img)
cv2.imshow("ones", ones_copy)
cv2.waitKey(32)
# coords = [[54, 199], [520, 336], [542, 177], [233, 121]]
# coords = [[233, 121]]
# y = ((x / 99.0) * 2) - 1

enter image description here

enter image description here

最佳答案

所以图像不需要转换,但底层的像素空间需要。我不是专家,但 AFAIK 的数学相当复杂。因此,如果您只关心结果,我建议采用简单的方法:

使用输入帧的大小创建黑色图像
在光标位置画一个白点
将黑色图像转换为矩形(描述为 here)

请注意,该点也会被拉伸(stretch)。如果您想要笛卡尔 x,y 位置,您可以在图像数组中查找第一个白色像素,也可以计算平均位置。或者例如使用 findcontours然后 findEnclosingCircle得到中心x,y。

作为引用,我添加了一个示例,但由于这只是上面链接的过程,(混合了一些鼠标界面),我不会详细解释它。请注意,单击角点的顺序是相关的,必须是顺时针的。

结果(光标在盘子上):
enter image description here

import cv2
import numpy as np

img_ori = cv2.imread('img.jpg')
img = img_ori.copy()
base = np.zeros((img_ori.shape[:2]))

l = []
setup = True
m = 0

def getTransform(points):
# from documentation linked above
pts1 = np.float32(points)
pts2 = np.float32([[0,0],[300,0],[300,300],[0,300]])

return cv2.getPerspectiveTransform(pts1,pts2)

def processMouse(event,x,y,flags,params):
global l,setup,m
if setup:
# create ROI + getTransform when 4 corners are clicked
if event == cv2.EVENT_LBUTTONDOWN:
l.append([x,y])
cv2.circle(img, (x,y), 5,(255,0,0),3)
cv2.imshow('IMG',img)
if(len(l)) == 4:
m = getTransform(l)
setup = False
else:
# draw mouse position

# with image
img2 = img_ori.copy()
cv2.circle(img2, (x,y), 5,(0,0,255),-1)
dst = cv2.warpPerspective(np.float32(img2), m, (300,300))
dst = np.array(dst, dtype='uint8')
cv2.imshow('IMG2',dst)

# black
img3 = base.copy()
cv2.circle(img3, (x,y), 5,(255),-1)
dst = cv2.warpPerspective(np.float32(img3), m, (300,300))
dst = np.array(dst, dtype='uint8')
cv2.imshow('IMG3',dst)


cv2.namedWindow('IMG')
cv2.setMouseCallback("IMG",processMouse)
cv2.imshow('IMG',img)

cv2.waitKey(0)
cv2.destroyAllWindows()

关于python - 如何在opencv python中将相机 View 转换为俯视笛卡尔平面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62037469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com