在Python中创建可迭代的鼠标单击事件?

内蒂克舒克拉

我试图向用户显示图像,并要求在用户的矩形上单击4个点,一旦用户完成操作,他将按“ c”键并退出,我的脚本应按用户返回接触点。

对于这种方法,我使用OpenCV在下面的脚本中编写了脚本,但是不确定如何为此目的使类可迭代,这可能是我对某些OO技术部分的看法是错误的,但是要求和逻辑是正确的,因为当不在类内部创建时,两个函数都可以正常工作。

码:

class mouse_select_points:
    ''' Select 4 user points from user and crop to straighten'''

    __depends__ = ['img_path']
    __provides__ = ['ratio','image_resized','click_points']

    def __init__(self, thickness=2,shape=(400,600),click_count=0,click_points=[],img_path=""):
        self.thickness = thickness
        self.shape = shape
        self.lent = click_count
        self.refPt = click_points
        self.img = img_path
        self.font = cv2.FONT_HERSHEY_SIMPLEX

    def __call__(self):
        image = cv2.imread(self.img)
        print("first loaded image size:",image.shape)
        orig_resized = image.copy()                             #create a copy of resized image
        ratio = image.shape[1] / 600.0
        self.shape = image.shape

        cv2.namedWindow("image")
        cv2.setMouseCallback("image", self._click_and_crop, param = [image] ) #setting param as image to be sent to mouse click function callback

        # keep looping until the 'c' key is pressed
        while True:
            # display the image and wait for a keypress
            cv2.imshow("image", image)
            cv2.putText(image,"press 'c' to crop or 'r' to reset",(10,15), self.font, .5,(255,255,255),1,cv2.LINE_AA)
            key = cv2.waitKey(1) & 0xFF

            # if the 'c' key is pressed, break from the loop
            elif key == ord("c") and self.lent == 4:
                break

        return ratio,orig_resized,self.refPt

    def _click_and_crop(self,event, x, y, flags, param):
        image = param[0]
        # if the left mouse button was clicked, record the starting
        # (x, y) coordinates and indicate that cropping is being performed
        if event == cv2.EVENT_LBUTTONDOWN:
            self.refPt.append([x, y])
            cv2.circle(image,(int(x),int(y)),self.thickness,(255,1,255),-1)
            self.lent += 1
            print("inside if")        
            cv2.imshow("image", image)

##testing
ratio,orig_image = mouse_select_points(img_path=r"Image1.JPG")
金·金

我认为您想重复选择要点。就这个。

#!/usr/bin/python3
# 2018.06.13 13:40:12 CST
# 2018.06.13 14:17:49 CST

import cv2
class PickPoints:
    ''' Select 4 user points from user and crop to straighten'''

    __depends__ = ['img_path']
    __provides__ = ['ratio','image_resized','click_points']

    def __init__(self, thickness=2,shape=(400,600),click_count=0,click_points=[],img_path=""):
        self.thickness = thickness
        self.shape = shape
        self.lent = click_count
        self.refPt = click_points
        self.img = img_path
        self.font = cv2.FONT_HERSHEY_SIMPLEX

    def __call__(self):
        image = cv2.imread(self.img)
        #print("first loaded image size:",image.shape)
        print("="*60)
        orig_resized = image.copy()                             #create a copy of resized image
        self.shape = image.shape
        self.lent = 0
        self.refPt = []
        self.to_exit = False

        cv2.namedWindow("image")
        cv2.setMouseCallback("image", self._click_and_crop, param = [image] ) #setting param as image to be sent to mouse click function callback

        # keep looping until the 'c' key is pressed
        while True:
            # display the image and wait for a keypress
            cv2.imshow("image", image)
            cv2.putText(image,"press 'c' to crop or 'r' to reset",(10,15), self.font, .5,(255,255,255),1,cv2.LINE_AA)
            key = cv2.waitKey(30) & 0xFF
            # if the 'c' key is pressed, break from the loop
            if key == ord("r"):
                print("Reset")
                self.lent = 0
                self.refPt = []
                image[:] = orig_resized
            if key == ord("c"):
                pass
            if self.to_exit or key in (27, ord('q'), ord('Q')):
                print("Exist")
                cv2.destroyAllWindows()
                self.to_exit = False
                break

        return self.refPt

    def _click_and_crop(self,event, x, y, flags, param):
        image = param[0]
        # if the left mouse button was clicked, record the starting
        # (x, y) coordinates and indicate that cropping is being performed
        if event == cv2.EVENT_LBUTTONDOWN:
            if len(self.refPt) <4:
                self.refPt.append([x, y])
                cv2.circle(image,(int(x),int(y)),self.thickness,(0,255,0),-1)
                self.lent += 1
                print("#{} {}".format(self.lent, self.refPt[-1]))
            cv2.imshow("image", image)
        if event == cv2.EVENT_RBUTTONDOWN:
            self.to_exit = True

##testing
fname = "/home/auss/Pictures/test.png"
pk = PickPoints(img_path=fname)

print(pk())
print(pk())
print(pk())

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章