【问题标题】:Program to identify pixel color on mouse click using python Tkinter使用python Tkinter识别鼠标点击像素颜色的程序
【发布时间】:2018-08-06 02:03:47
【问题描述】:

我用python写了一个小脚本,这样我就可以点击图像,程序会返回我点击图像点的像素位置和BGR中的像素颜色。

我使用点击位置来访问图像 numpy 数组(通过 cv.imread)。

问题是返回的位置偏离了原始图像。不知何故,图像的实际大小被修改了,我得到了错误的像素颜色或索引超出了范围。我尝试使用与原始图像相同的几何形状,但没有成功。

代码如下:

# -*- coding: utf-8 -*-
import cv2 as cv
import numpy as np
import Tkinter as tk
from PIL import ImageTk, Image
import sys
imgCV = cv.imread(sys.argv[1])
print(imgCV.shape)
root = tk.Tk()
geometry = "%dx%d+0+0"%(imgCV.shape[0], imgCV.shape[1])
root.geometry()
def leftclick(event):
    print("left")
    #print root.winfo_pointerxy()
    print (event.x, event.y)
    #print("BGR color")
    print (imgCV[event.x, event.y])
    # convert color from BGR to HSV color scheme
    hsv = cv.cvtColor(imgCV, cv.COLOR_BGR2HSV)
    print("HSV color")
    print (hsv[event.x, event.y])
# import image
img = ImageTk.PhotoImage(Image.open(sys.argv[1]))
panel = tk.Label(root, image = img)
panel.bind("<Button-1>", leftclick)
#panel.pack(side = "bottom", fill = "both", expand = "no")
panel.pack(fill = "both", expand = 1)
root.mainloop()

我使用的测试图像是这样的:

非常感谢您的任何帮助!

【问题讨论】:

    标签: python opencv tkinter


    【解决方案1】:

    我过去在做一个非常相似的事情时遇到的一个问题是,当坐标为(x, y)(row, col) 时保持直线。

    虽然 TK 会返回 x 和 y 坐标,但 OpenCV 的像素寻址方案是底层 numpy ndarray - image[row, col]

    因此,调用:

    print (imgCV[event.x, event.y])
    print (hsv[event.x, event.y])
    

    应该改写为:

    print (imgCV[event.y, event.x])
    print (hsv[event.y, event.x])
    

    有关何时使用每种方法的更多信息,请查看answer

    【讨论】:

    • 这解决了我的问题并节省了我很多时间!该链接也很有指导意义。
    • 很高兴能帮上忙!
    【解决方案2】:

    您交换了图像的坐标。在函数内部进行以下更改 -

    print (imgCV[event.y, event.x])
    print (hsv[event.y, event.x])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 2018-08-26
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 2013-09-13
      相关资源
      最近更新 更多