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通过鼠标点击图片获取该点坐标,并填充区域的主要内容,如果未能解决你的问题,请参考以下文章

安卓 百度地图API怎么点击地图获取坐标

请问Unity鼠标点击后如何获得当前所点击到的UI名字?

c#如何获取鼠标选取的内容

怎么用vue实现点击图片(按钮)的波纹效果(涟漪动效)

在MATLAB二维图中,随鼠标移动,显示该点的坐标信息,如何做到?谢谢大家,在线等

js获取鼠标点击事件的相对位置