opencv-python通过鼠标点击图片获取该点坐标,并填充区域
Posted 辉煌zzg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv-python通过鼠标点击图片获取该点坐标,并填充区域相关的知识,希望对你有一定的参考价值。
我们在工作中总会遇到一些需要获取坐标的方式,来对图像进行处理填充色彩,
但是直接输入坐标,往往不是自己的想要的位置,所以需要不断的调整填入的坐标。
如果能直接在图片上点击需要的点,是不是也很方便。
点击获取坐标
还是这张图片,老演员了
现在图片上随机点几个点
结果显示无误,代码如下:
import cv2
import numpy as np
img = cv2.imread('6.jpg') #加载本地的图像
a = [] #用于存放横坐标
b = [] #用于存放纵坐标
#定义点击事件
def on_EVENT_LBUTTONDOWN(event, x, y,flags, param):
if event == cv2.EVENT_LBUTTONDOWN: #如果存在鼠标点击事件
xy = "%d,%d" % (x, y) #得到坐标x,y
a.append(x) #将每次的坐标存放在a数组里面
b.append(y) #将每次的坐标存放在b数组里面
cv2.circle(img, (x, y), 1, (0, 0, 255), thickness=-1) #点击的地方小红圆点显示
cv2.putText(img, xy, (x, y), cv2.FONT_HERSHEY_PLAIN, #点击的地方显示坐标数字 参数1图片,参数2添加的文字,参数3左上角坐标,参数4字体,参数5字体粗细
1.0, (0, 0, 0), thickness=1)
cv2.imshow("image", img) #显示图片
cv2.namedWindow("image") #定义图片窗口
cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN) #回调函数,参数1窗口的名字,参数2鼠标响应函数
cv2.imshow("image", img) #显示图片
cv2.waitKey(0) #不断刷新图像
c = [] #用于存放所有坐标
for i in range(0,len(a)):
print(a[i], b[i]) # 打印坐标
c.append([a[i], b[i]])
print(c)
以上就是点击获取坐标,看其他来还是非常好用,
接下来就是对坐标所在区域进行填充颜色
坐标区域填色
根据刚刚的三个坐标即可得到
代码如下:
import cv2
import numpy as np
img = cv2.imread('6.jpg') #加载本地的图像
c = [[101,134],[198,133],[165,174]]
# #显示获取读取进来的图片长宽
h, w = img.shape[:2]
mask = np.zeros((h, w), dtype=np.uint8) #创建一个等图像大小的全黑背景
ndarray_pts= np.array(c, np.int32) # 将坐标数组转化成矩阵
fill_img = cv2.fillPoly(mask, [ndarray_pts], (255,0,0)) #对所在区域进行填充颜色,参数二为上面获得的坐标矩阵, 参数3为填充颜色
cv2.imshow("image2", fill_img)
cv2.waitKey(0)
当然我们需要的是能将填充区域在原图上显示,那么
代码如下:
import cv2
import numpy as np
img = cv2.imread('6.jpg') #加载本地的图像
c = [[101,134],[198,133],[165,174]]
# #显示获取读取进来的图片长宽
h, w = img.shape[:2]
mask = np.zeros((h, w), dtype=np.uint8) #创建一个等图像大小的全黑背景
ndarray_pts= np.array(c, np.int32) # 将坐标数组转化成矩阵
fill_img = cv2.fillPoly(mask, [ndarray_pts], (255,0,0)) #对所在区域进行填充颜色,参数二为上面获得的坐标矩阵, 参数3为填充颜色
fill_img = fill_img[:, :, np.newaxis] # np.newaxis用于增加第三维的维度
fill_img = np.array(fill_img * [1, 1, 1], np.uint8) #转化3维矩阵
fill_img = cv2.add(img, fill_img) #将两个图片进行像素相加
cv2.imshow("image2", fill_img)
cv2.waitKey(0)
完整代码如下:
import cv2
import numpy as np
img = cv2.imread('6.jpg') #加载本地的图像
a = [] #用于存放横坐标
b = [] #用于存放纵坐标
print('请随意点击3个以上坐标:')
#定义点击事件
def on_EVENT_LBUTTONDOWN(event, x, y,flags, param):
if event == cv2.EVENT_LBUTTONDOWN: #如果存在鼠标点击事件
xy = "%d,%d" % (x, y) #得到坐标x,y
a.append(x) #将每次的坐标存放在a数组里面
b.append(y) #将每次的坐标存放在b数组里面
cv2.circle(img, (x, y), 1, (0, 0, 255), thickness=-1) #点击的地方小红圆点显示
cv2.putText(img, xy, (x, y), cv2.FONT_HERSHEY_PLAIN, #点击的地方显示坐标数字 参数1图片,参数2添加的文字,参数3左上角坐标,参数4字体,参数5字体粗细
1.0, (0, 0, 0), thickness=1)
cv2.imshow("image", img) #显示图片
cv2.namedWindow("image") #定义图片窗口
cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN) #回调函数,参数1窗口的名字,参数2鼠标响应函数
cv2.imshow("image", img) #显示图片
cv2.waitKey(0)
c = [] #用于存放所有坐标
for i in range(0,len(a)):
print(a[i], b[i]) # 打印坐标
c.append([a[i], b[i]])
print(c)
if len(c)<3:
print('请重新运行,并点击3个以上坐标……')
else:
h, w = img.shape[:2] # #显示获取读取进来的图片长宽
mask = np.zeros((h, w), dtype=np.uint8) #创建一个等图像大小的全黑背景
ndarray_pts= np.array(c, np.int32) # 将坐标数组转化成矩阵
fill_img = cv2.fillPoly(mask, [ndarray_pts], color = 1) #对所在区域进行填充颜色,参数二为上面获得的坐标矩阵, 参数3为填充颜色
fill_img = fill_img[:, :, np.newaxis] # np.newaxis用于增加第三维的维度
fill_img = np.array(fill_img * [255, 255, 255], np.uint8) #转化3维矩阵
fill_img = cv2.add(img, fill_img) #将两个图片像素相加
cv2.imshow("image2", fill_img)
cv2.waitKey(0)
当点击3个以上坐标,可得到如上图所示的效果,如果点击坐标不足3个及以上,则提示重新运行
如果想结果没有坐标显示,可以运行以下代码:
import cv2
import numpy as np
img = cv2.imread('6.jpg') #加载本地的图像
img2 = img.copy()
a = [] #用于存放横坐标
b = [] #用于存放纵坐标
print('请随意点击3个以上坐标:')
#定义点击事件
def on_EVENT_LBUTTONDOWN(event, x, y,flags, param):
if event == cv2.EVENT_LBUTTONDOWN: #如果存在鼠标点击事件
xy = "%d,%d" % (x, y) #得到坐标x,y
a.append(x) #将每次的坐标存放在a数组里面
b.append(y) #将每次的坐标存放在b数组里面
cv2.circle(img, (x, y), 1, (0, 0, 255), thickness=-1) #点击的地方小红圆点显示
cv2.putText(img, xy, (x, y), cv2.FONT_HERSHEY_PLAIN, #点击的地方显示坐标数字 参数1图片,参数2添加的文字,参数3左上角坐标,参数4字体,参数5字体粗细
1.0, (0, 0, 0), thickness=1)
cv2.imshow("image", img) #显示图片
cv2.namedWindow("image") #定义图片窗口
cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN) #回调函数,参数1窗口的名字,参数2鼠标响应函数
cv2.imshow("image", img) #显示图片
cv2.waitKey(0)
c = [] #用于存放所有坐标
for i in range(0,len(a)):
print(a[i], b[i]) # 打印坐标
c.append([a[i], b[i]])
print(c)
if len(c)<3:
print('请重新运行,并点击3个以上坐标……')
else:
h, w = img.shape[:2] # #显示获取读取进来的图片长宽
mask = np.zeros((h, w), dtype=np.uint8) #创建一个等图像大小的全黑背景
ndarray_pts= np.array(c, np.int32) # 将坐标数组转化成矩阵
fill_img = cv2.fillPoly(mask, [ndarray_pts], color = 1) #对所在区域进行填充颜色,参数二为上面获得的坐标矩阵, 参数3为填充颜色
fill_img = fill_img[:, :, np.newaxis] # np.newaxis用于增加第三维的维度
fill_img = np.array(fill_img * [255, 255, 255], np.uint8) #转化3维矩阵
fill_img = cv2.add(img2, fill_img) #将两个图片像素相加
cv2.imshow("image2", fill_img)
cv2.imwrite('1.jpg',fill_img)
cv2.waitKey(0)
当然我们在运行的时候很可能会遇到opencv报错的问题
cv2.error: OpenCV(4.5.3) C:\\Users\\runneradmin\\AppData\\Local\\Temp\\pip-req-build-z4706ql7\\opencv\\modules\\highgui\\src\\window.cpp:1274: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
遇到这种报错,这个估计是版本没下载好,删了重来
pip uninstall opencv-python
pip3 install opencv-contrib-python
当然报错还有可能是路径带有中文或空格有时也会报错。
还有的保存是函数的版本不同,老版本返回的是三个参数,新版本却只有两个参数
比如
contours,heriachy = cv.findContours(binary,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
那么本期博客就写到这里,
记得点赞关注加收藏,多支持博主,才能有动力日更不断!!!
有需要写代码 和修改代码的可以联系我的扣扣:334542894
以上是关于opencv-python通过鼠标点击图片获取该点坐标,并填充区域的主要内容,如果未能解决你的问题,请参考以下文章