机器学习笔记之——获取图像中某点坐标
最近在学习做图像分割训练模型时用到了OpenCV这个包,在对图上某部分特征进行批量分割时总是不停的尝试扩大坐标、打印图像检查正确性、缩小、再打印、再重新调整,感觉自己像个憨憨一样,所以就想如果能实现一种方法找到鼠标点击处的坐标并输出到图片上,岂不是以后可以很方便?一番查询后才发现,原来OpenCV里自带的一些函数就可以实现这一功能,去看了OpenCV的官方文档,发觉到了OpenCV的强大之处,以下先吹一波OpenCV,读者可以跳过介绍部分直入正题。
OpenCV介绍
OpenCV于1999年由Gary Bradsky在Intel公司创建,第一个版本于2000年发布。瓦迪姆·皮萨列夫斯基加入加里·布拉斯基管理英特尔俄罗斯软件OpenCV团队。2005年,OpenCV被用于Stanley,这款车赢得了美国国防部高级研究计划局2005年的重大挑战。后来,在柳树车库的支持下,项目继续积极发展,由Gary Bradsky和Vadim Pisarevsky领导。目前,OpenCV支持许多与计算机视觉和机器学习相关的算法,并且它正在日益扩展。目前OpenCV支持多种编程语言,如c++、Python、Java等,可以在不同的平台上使用,包括Windows、Linux、OS X、Android、iOS等。此外,基于CUDA和OpenCL的接口也在积极开发用于高速GPU操作。OpenCV-Python是OpenCV的Python API。它结合了OpenCV c++ API和Python语言的最佳特性。
实列
实现获取像素点的功能主要基于OpenCV的内置函数cv2.setMouseCallback(),即鼠标事件回调,我们来看看官方文档里是怎么使用这个函数的:
import cv2
import numpy as np
# mouse callback function
def draw_circle(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img,(x,y),100,(255,0,0),-1)
# Create a black image, a window and bind the function to window
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
if cv2.waitKey(20) & 0xFF == 27:
break
cv2.destroyAllWindows()
其中draw_circle这个函数实现的功能很简单,就是在双击过的地方画一个圆
代码只有两句,如果检测到鼠标事件,则在鼠标双击的坐标处画一个大小为100的圆,由于OpenCV读入图片方式是BGR型的,那么此处颜色就为蓝色
然后下方创建了一个512*512大小的图片窗口,调用CALL函数并显示图片,当检测到ESC时退出窗口。
顺便提一句,这里的“&0xFF”是针对64位系统的,32位的需要去掉这里,27即ASCII码,代表ESC
结果如下:
那根据这个官方的程序,我们想获得xy的坐标值就很简单了,直接看代码吧:
import cv2
import numpy as np
img=cv2.imread('img.jpg')
def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
xy = "%d,%d" % (x, y)
cv2.circle(img, (x, y), 1, (255, 0, 0), thickness = -1)
cv2.putText(img, xy, (x, y), cv2.FONT_HERSHEY_PLAIN,
1.0, (0,0,0), thickness = 1)
cv2.imshow("image", img)
cv2.namedWindow("image")
cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN)
while(1):
cv2.imshow("image", img)
if cv2.waitKey(0)&0xFF==27:
break
cv2.destroyAllWindows()
效果如下:
按ESC退出