我在现有图像的顶部使用鼠标单击(每次鼠标单击都是一个连接的点)在 python(带有 opencv 包)中绘制了几条线,您可以将其视为允许用户在图像上选择某些内容。
我如何允许用户通过单击鼠标右键来删除图像上的最后一个点?这是我当前的代码:
import numpy
import cv2
points = []
def draw_point(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
cv2.circle(image, (x,y), 1, (255,0,0),-1)
points.append((x,y))
pts = numpy.array(points, numpy.int32)
cv2.polylines(image,[pts],False,(255,0,0))
elif event == cv2.EVENT_RBUTTONDOWN:
# HOW TO DELETE?
del points[-1]
pts = numpy.array(points, numpy.int32)
cv2.polylines(image,[pts],True,(255,0,0))
image = cv2.imread('simple_tattoo.jpg', cv2.IMREAD_UNCHANGED)
cv2.namedWindow('example', cv2.WINDOW_AUTOSIZE)
cv2.setMouseCallback('example', draw_point)
while(1):
cv2.imshow('example',image)
if cv2.waitKey(20) & 0xFF == 27:
break
cv2.destroyAllWindows()
print (points)
Run Code Online (Sandbox Code Playgroud)
是否有更简单的方法在图像上绘制线条(任何东西)?
所以我写了这个小程序,它允许我在两个图像上选择 4 个点。
使用这些点我得到一个变换矩阵。之后,我在其中一张图像上选择一个点,并希望可视化该点在其他图像上的位置。
假设我的观点是这样标记的 -> (x,y)- 所以它是一个元组。我应该如何在图像上格式化这个“位置”,以便可以对其进行转换。
我查看了perspectiveTransform() 方法的文档,并认为我应该将其存储为以下形状:
numpy.array([
[self.points[self.length-1][0]],
[self.points[self.length-1][1]]
], dtype="float32")
Run Code Online (Sandbox Code Playgroud)
只需单击一下,我就会得到这种格式:
Point= [[ 2300.]
[ 634.]]
Run Code Online (Sandbox Code Playgroud)
这种格式似乎不起作用,我使用这个转换矩阵:
M = [[ -1.71913123e+00 -4.76850572e+00 5.27968944e+03]
[ 2.07693562e-01 -1.09738424e+01 6.35222770e+03]
[ 1.02865125e-04 -4.80067600e-03 1.00000000e+00]]
Run Code Online (Sandbox Code Playgroud)
在这种方法中(并得到以下错误):
cv2.perspectiveTransform(src, M)
OpenCV Error: Assertion failed (scn + 1 == m.cols) in cv::perspectiveTransform, file C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\core\src\matmul.cpp
Run Code Online (Sandbox Code Playgroud)
欢迎任何建议或提示。
我有RGB格式或灰度格式的图像(例如,我通过Gimp对其进行了转换),现在每次我以灰度级加载图像,或者只是将其转换为灰度格式时,形状始终显示[height,width],而没有第三个尺寸(颜色通道数)。
我知道通常黑白图像都是以这种格式存储的,但是我特别需要[height, width, 1]图像形状,即可以得到的图像形状,例如:
numpy.zeros(shape=[400, 400, 1])
Run Code Online (Sandbox Code Playgroud) 这在 Python 中可能吗?我在 linux 上工作,所以我想知道是否有办法在调用脚本时组合 bash 命令(类似于 pwd)。