python - 如何将 OpenCV 设置为使用原点作为图像的左下角?
问题描述
是否可以将 OpenCV 设置为使用图像的左下角作为原点?
我正在使用 cv2.imshow() 在窗口中显示图像,该窗口允许我单击图像并获取 mouseclick 事件的坐标。我可以使用这个问题的部分答案来让图像显示我想要的方式(在 x 轴上倒置)但是当我单击图像以检索坐标时,原点仍位于左上角图片。
import cv2 # Version 3.4.5
import imutils as im
import numpy as np
import matplotlib.pyplot as plt
list_of_coords = []
def store_mouse_coords(event, x, y, flags, params):
global list_of_coords
if event == cv2.EVENT_LBUTTONDOWN:
list_of_coords.append((x, y))
print(list_of_coords[-3:])
return list_of_coords
def select_points_on_im(image, window_name='Select points'):
image = image.copy()
image = image[::-1, :, :]
while True:
cv2.namedWindow(window_name)
cv2.setMouseCallback(window_name, store_mouse_coords)
cv2.imshow(window_name, image)
#plt.imshow(window_name, image, plt.gca().invert_yaxis,plt.show())
key = cv2.waitKey(0) & 0xFF
if key == ord("q"):
break
cv2.destroyAllWindows()
return
select_points_on_im(image)
注释掉的行plt.imshow(window_name, image, plt.gca().invert_yaxis,plt.show())
是我想要实现的,但是imshow
从 OpenCV 使用,以便我可以使用我的回调函数。我正在使用 Python3 和 OpenCV 3.4.5 版。
解决方案
根据Mark Setchell 的评论,我将这一行添加adj_y = image.shape[0] - y
到鼠标回调中以实现所需的行为。一个让我困惑了一段时间的小问题,来自numpy
返回行的形状属性,cols-即y,x:
list_of_coords = []
def store_mouse_coords(event, x, y, flags, params):
global list_of_coords
if event == cv2.EVENT_LBUTTONDOWN:
adj_y = image.shape[0] - y # adjusted y
print('image shape is {}'.format(image.shape[:2]))
print('y was {}, image height minus y is {}'.format(y, adj_y))
list_of_coords.append((x, adj_y))
return list_of_coords
推荐阅读
- java - 是否可以在 EC2 中运行具有持久 H2 的 Java EE 后端?
- hive - hive sql将记录计数添加为列
- c++ - 使用 dlopen/dlsym 打开 C++ 共享库 - dlsym 返回 NULL
- javascript - onkeyup后如何触发onkeydown?
- prolog - Prolog 事后删减
- swift - NSPopover 中包含的 NSCollectionView 不显示内容
- java - 在不知道 Android Studio 中的数量的情况下动态创建复选框
- node.js - 如何等待异步 HTTP 请求在 Angular 4 上返回值?
- html - 无法以我喜欢的方式控制我的单选框/复选框边距
- python - Pandas:查找特定列不是 NA 但所有其他列都是的行