精华内容
下载资源
问答
  • 在绘制矩形的同时按住
    千次阅读
    2020-12-15 11:28:39

    滚动条不显示,因为您将它们网格化为一个框架(self.sbarv = Scrollbar(self,…)),您不将其放入父窗口.您可以直接将Canvas网格化到父窗口(self.canvas = Canvas(master,…)).

    你应该做的也是将Canvas放入自己,然后使用框架将框架打包到主窗口

    app = ExampleApp(root)

    app.pack()

    但是,在滚动时,event.x和event.y不再代表画布上的正确位置,因此您应该使用

    self.start_x = self.canvas.canvasx(event.x)

    self.start_y = self.canvas.canvasy(event.y)

    curX = self.canvas.canvasx(event.x)

    curY = self.canvas.canvasy(event.y)

    那么,我知道你想在鼠标拖动到画布的一个边框时自动滚动画布?要做到这一点,您需要检查鼠标是否位于画布的一个边缘,如果是,则向该方向滚动.您可以使用以下内容:

    w, h = self.canvas.winfo_width(), self.canvas.winfo_height()

    if event.x > 0.9*w:

    self.canvas.xview_scroll(1, 'units')

    elif event.x < 0.1*w:

    self.canvas.xview_scroll(-1, 'units')

    if event.y > 0.9*h:

    self.canvas.yview_scroll(1, 'units')

    elif event.y < 0.1*h:

    self.canvas.yview_scroll(-1, 'units')

    因此,代码中实现的所有内容都变为:

    import PIL.Image

    import Image

    import ImageTk

    from Tkinter import *

    class ExampleApp(Frame):

    def __init__(self,master):

    Frame.__init__(self,master=None)

    self.x = self.y = 0

    self.canvas = Canvas(self, cursor="cross")

    self.sbarv=Scrollbar(self,orient=VERTICAL)

    self.sbarh=Scrollbar(self,orient=HORIZONTAL)

    self.sbarv.config(command=self.canvas.yview)

    self.sbarh.config(command=self.canvas.xview)

    self.canvas.config(yscrollcommand=self.sbarv.set)

    self.canvas.config(xscrollcommand=self.sbarh.set)

    self.canvas.grid(row=0,column=0,sticky=N+S+E+W)

    self.sbarv.grid(row=0,column=1,stick=N+S)

    self.sbarh.grid(row=1,column=0,sticky=E+W)

    self.canvas.bind("", self.on_button_press)

    self.canvas.bind("", self.on_move_press)

    self.canvas.bind("", self.on_button_release)

    self.rect = None

    self.start_x = None

    self.start_y = None

    self.im = PIL.Image.open("logo.png")

    self.wazil,self.lard=self.im.size

    self.canvas.config(scrollregion=(0,0,self.wazil,self.lard))

    self.tk_im = ImageTk.PhotoImage(self.im)

    self.canvas.create_image(0,0,anchor="nw",image=self.tk_im)

    def on_button_press(self, event):

    # save mouse drag start position

    self.start_x = self.canvas.canvasx(event.x)

    self.start_y = self.canvas.canvasy(event.y)

    # create rectangle if not yet exist

    if not self.rect:

    self.rect = self.canvas.create_rectangle(self.x, self.y, 1, 1, outline='red')

    def on_move_press(self, event):

    curX = self.canvas.canvasx(event.x)

    curY = self.canvas.canvasy(event.y)

    w, h = self.canvas.winfo_width(), self.canvas.winfo_height()

    if event.x > 0.9*w:

    self.canvas.xview_scroll(1, 'units')

    elif event.x < 0.1*w:

    self.canvas.xview_scroll(-1, 'units')

    if event.y > 0.9*h:

    self.canvas.yview_scroll(1, 'units')

    elif event.y < 0.1*h:

    self.canvas.yview_scroll(-1, 'units')

    # expand rectangle as you drag the mouse

    self.canvas.coords(self.rect, self.start_x, self.start_y, curX, curY)

    def on_button_release(self, event):

    pass

    if __name__ == "__main__":

    root=Tk()

    app = ExampleApp(root)

    app.pack()

    root.mainloop()

    更多相关内容
  • c#绘图源码,可以按住鼠标拖动图形及通过八个方向拉伸图形
  • OpenCV中鼠标交互-绘制矩形框 ·具体流程: 1、绑定回调函数 2、回调函数中检测触发的事件 3、根据不同事件做出不同动作 一、绑定回调函数 cv2.setMouseCallback('origianl',click_event) 'origianl’为窗体的...

    OpenCV中鼠标交互-绘制矩形框

    ·具体流程:
    1、绑定回调函数
    2、在回调函数中检测触发的事件
    3、根据不同事件做出不同动作

    一、绑定回调函数

    cv2.setMouseCallback('origianl',click_event)
    

    'origianl’为窗体的名字,client_event为回调函数的函数名

    二、在回调函数中检测触发的事件

    回调函数的的参数为固定格式:
    第一个参数event:事件类型
    x:为坐标x
    y:为坐标y
    flags:为鼠标滚轮的方向
    param:为传入参数

    def click_event(event,x,y,flags,param):
        global startP
        global endP
        global flag
        global currentP
        global stop
        global img
        img2 = img.copy()
        if event == cv2.EVENT_RBUTTONDOWN:
            flag = 1
            startP = (x,y)
            stop = 1
    
        if event == cv2.EVENT_LBUTTONDOWN:
            flag = 0
            endP = (x,y)
            cv2.rectangle(img,startP,endP,[0,0,255])
            stop = 0
    
        if event == cv2.EVENT_MOUSEMOVE:
            currentP = (x,y)
            if flag == 1:
                cv2.rectangle(img2,startP,currentP,[0,0,255])
                cv2.imshow('origianl',img2)
        if event == cv2.EVENT_MOUSEWHEEL:
            print(x,y)
            print(flags)
            print(param)
    

    三、根据不同事件做出不同动作

    常用的鼠标事件有以下几种:cv2.EVENT_RBUTTONDOWN、cv2.EVENT_RBUTTONUP、cv2.EVENT_MOUSEMOVE、cv2.MOUSEWHEEL.以上四种事件为,右键按下事件、右键松开事件、鼠标移动事件、鼠标滚轮事件
    右键按下为矩形框开始点,左键按下为矩形框右下角结束点,将图像绘制在img图像中可以保存。按下右键然后移动鼠标会实时显示矩形框,此时将矩形框显示在img的copy版上并不保存。
    具体的实现效果如下:
    在这里插入图片描述

    展开全文
  • 本源代码主要演示Delphi7利用鼠标绘制矩形焦点,画出虚线框矩形,按住鼠标左键抖动矩形区域,即可显示虚线矩形框,可应用于需要拖动选择对象时作为选区使用,Delphi中,这个功能使用Canvas实现:  procedure ...
  • 感兴趣区域传统绘制: opencv学习笔记5:感兴趣区域ROI opencv 鼠标事件 1.opencv 鼠标事件类型 import cv2 d=[i for i in dir(cv2) if 'EVENT' in i] print(d) 'EVENT_FLAG_ALTKEY':代表拖拽事件。按住alt键不放...

    基础版笔记传送门:
    python3+opencv学习笔记汇总目录(适合基础入门学习)
    进阶版笔记目录:
    python+opencv进阶版学习笔记目录(适合有一定基础)

    感兴趣区域传统绘制:
    opencv学习笔记5:感兴趣区域ROI

    opencv 鼠标事件

    1.opencv 鼠标事件类型

    import cv2
    
    d=[i for i in dir(cv2) if 'EVENT' in i]
    print(d)
    
    'EVENT_FLAG_ALTKEY':代表拖拽事件。按住alt键不放
    'EVENT_FLAG_CTRLKEY'按住ctrl键不放
    'EVENT_FLAG_LBUTTON'按住左键拖拽
    'EVENT_FLAG_MBUTTON'中键拖拽
    'EVENT_FLAG_RBUTTON'右键拖拽
    'EVENT_FLAG_SHIFTKEY'按住shift不放
    'EVENT_LBUTTONDBLCLK'event鼠标事件。左键双击
    'EVENT_LBUTTONDOWN'按下左键
    'EVENT_LBUTTONUP'释放左键
     'EVENT_MBUTTONDBLCLK' 中键双击
     'EVENT_MBUTTONDOWN'中键点击
     'EVENT_MBUTTONUP'中键放开
     'EVENT_MOUSEHWHEEL'
     'EVENT_MOUSEMOVE'滑动
     'EVENT_MOUSEWHEEL',
     'EVENT_RBUTTONDBLCLK',右键双击
     'EVENT_RBUTTONDOWN',右键点击
     'EVENT_RBUTTONUP'右键释放
    

    2.opencv回调函数

    cv2.setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)
    
    winname:窗口的名字 
    onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。 这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags, void* param);
    userdate:传给回调函数的参数 
    

    响应函数

    void on_Mouse(int event, int x, int y, int flags, void* param);
    event是 CV_EVENT_*变量之一
    x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系) 
    flags是CV_EVENT_FLAG的组合, param是用户定义的传递到setMouseCallback函数调用的参数。
    
    

    opencv 绘图函数

    1绘制直线
    cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
    参数:图像名,起点,终点,颜色,笔宽/px

    import numpy as np
    import cv2
    # Create a black image
    img = np.zeros((512, 512, 3), np.uint8)
    # Draw a diagonal blue line with thickness of 5 px
    cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    2绘制矩形
    cv2.rectangle(img,(104,50),(300,128),(0,255,0),5)
    参数:图像名,左上角,右下角,颜色,笔粗细

    import numpy as np
    import cv2
    # Create a black image
    img = np.zeros((400, 400, 3), np.uint8)
    cv2.rectangle(img,(104,50),(300,128),(0,255,0),5)
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    3绘制圆形
    cv2.circle(img,中心点(x,y), 半径, 颜色(0,255,255), -1或1)
    参数:图像名,中心点,半径,颜色。-1是绘制真个圆,1边框。

    import numpy as np
    import cv2
    # Create a black image
    img = np.zeros((400, 400, 3), np.uint8)
    cv2.circle(img,(100,63), 63, (0,255,255), -1)
    cv2.circle(img,(300,63), 63, (0,0,255), 1)
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    4绘制椭圆

    cv2.ellipse(img,(256,256),(100,50),0,0,120,(0,0,255),-1)
    参数:
    中心点坐标:如(256,256)
    长轴和短轴长度:如(100,50)
    夹角椭圆在逆时针方向旋转的角度:如0
    起始角和端角表示从主轴顺时针方向测量的椭圆弧的开始和结束:如 0,120
    颜色:如(0,0,255)
    整个还是轮廓:-1表示整个椭圆,1表示轮廓

    import numpy as np
    import cv2
    # Create a black image
    img = np.zeros((400, 400, 3), np.uint8)
    cv2.ellipse(img,(256,256),(100,50),0,0,120,(0,0,255),-1)
    cv2.ellipse(img,(120,120),(100,50),0,0,360,(0,255,255),1)
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    5绘制多边形
    pts = np.array([[50,30],[150,30],[200,80],[40,90]], np.int32)
    传入的是几个点的坐标,可以有很多点。

    import numpy as np
    import cv2
    # Create a black image
    img = np.zeros((400, 400, 3), np.uint8)
    pts = np.array([[50,30],[150,30],[200,80],[40,90]], np.int32)
    pts = pts.reshape((-1,1,2))
    cv2.polylines(img,[pts],True,(0,0,255))
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    使用鼠标在图片上绘制矩形框

    绘制一个矩形框 方法1
    这段代码有借鉴其他博客

    import cv2
    
    global img
    global point1, point2
    
    #鼠标响应函数
    def Rectangular_box(event, x, y, flags, param):
        global img, point1, point2
        img2 = img.copy()
        if event == cv2.EVENT_LBUTTONDOWN:  # 左键点击
            point1 = (x, y)
            cv2.circle(img2, point1, 10, (0, 255, 0), 5)
            cv2.imshow('img', img2)
        elif event == cv2.EVENT_MOUSEMOVE and (flags & cv2.EVENT_FLAG_LBUTTON):  # 按住左键拖曳
            cv2.rectangle(img2, point1, (x, y), (255, 0, 0), 5)
            cv2.imshow('img', img2)
        elif event == cv2.EVENT_LBUTTONUP:  # 左键释放
            point2 = (x, y)
            cv2.rectangle(img2, point1, point2, (0, 255, 255), 4)
            cv2.imshow('img', img2)
            min_x = min(point1[0], point2[0])
            min_y = min(point1[1], point2[1])
            width = abs(point1[0] - point2[0])
            height = abs(point1[1] - point2[1])
            cut_img = img[min_y:min_y + height, min_x:min_x + width]
            #cv2.imwrite('baocun.jpg', cut_img)
            cv2.imshow('result',cut_img
    def main():
        global img
        img = cv2.imread('yangmi.jpg')
        img=cv2.resize(img,None,fx=0.4,fy=0.4)
        cv2.namedWindow('image')
        cv2.setMouseCallback('image', Rectangular_box)
        cv2.imshow('image', img)
        cv2.waitKey(0)
    if __name__ == '__main__':
        main()
    

    绘制一个矩形框 方法2
    使用函数cv2.selectROI(windowName, img, showCrosshair=None, fromCenter=None)
    windowName:选择的区域被显示在的窗口的名字
    img:要在什么图片上选择ROI
    showCrosshair:是否在矩形框里画十字线.
    fromCenter:是否是从矩形框的中心开始画

    import cv2
    img=cv2.imread('fangye.jpg')
    
    r= cv2.selectROI('ROI',img,False,False)
    #x,y,w,h=r
    print(r)
    imCrop = img[int(r[1]):int(r[1] + r[3]), int(r[0]):int(r[0] + r[2])]
    cv2.imshow("cut_image", imCrop)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    结果r=(109, 44, 243, 153)

    框选后 一点要点击 Enter 键才显示框选图像。

    绘制多边形框
    cv2.polylines:绘制多边形框
    cv2.fillPoly:填充多边形框。把框内填满,使其是多边形。
    这下面这段代码借鉴博客
    OpenCV-Python选择ROI(矩形和多边形)

    import cv2
    
    import numpy as np
    
    
    pts = []  # 用于存放点
    # 统一的:mouse callback function
    def on_mouse(event, x, y, flags, param):
        img2 = img.copy()
    
        if event == cv2.EVENT_LBUTTONDOWN:  # 左键点击,选择点
            pts.append((x, y))
    
        if event == cv2.EVENT_RBUTTONDOWN:  # 右键点击,取消最近一次选择的点
            pts.pop()
    
        if event == cv2.EVENT_RBUTTONDBLCLK:  # 右键双击绘制轮廓
            mask = np.zeros(img.shape, np.uint8)#掩膜
            points = np.array(pts, np.int32)
            points = points.reshape((-1, 1, 2))
            # 画多边形
            mask = cv2.polylines(mask, [points], True, (255, 255, 255), 2)
            mask2 = cv2.fillPoly(mask.copy(), [points], (255, 255, 255))  # 用于求 ROI
            mask3 = cv2.fillPoly(mask.copy(), [points], (0, 255, 0))  # 用于 显示在桌面的图像
    
            show_image = cv2.addWeighted(src1=img, alpha=0.8, src2=mask3, beta=0.2, gamma=0)
    
            #cv2.imshow("mask", mask2)
            cv2.imshow("show_img", show_image)
    
            ROI = cv2.bitwise_and(mask2, img)
            cv2.imshow("ROI", ROI)
            cv2.waitKey(0)
    
        if len(pts) > 0:
            # 将pts中的最后一点画出来
            cv2.circle(img2, pts[-1], 3, (0, 0, 255), -1)
    
        if len(pts) > 1:
            # 画线
            for i in range(len(pts) - 1):
                cv2.circle(img2, pts[i], 5, (0, 0, 255), -1)  # x ,y 为鼠标点击地方的坐标
                cv2.line(img=img2, pt1=pts[i], pt2=pts[i + 1], color=(255, 0, 0), thickness=2)
    
        cv2.imshow('image', img2)
    
    
    # 创建图像与窗口并将窗口与回调函数绑定
    img = cv2.imread("fangye.jpg")
    cv2.namedWindow('image')
    cv2.setMouseCallback('image', on_mouse)
    print("[INFO] 单击左键:选择点,单击右键:删除上一次选择的点,双击右键:确定ROI区域")
    print("[INFO] 按 ESC 退出")
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    用下 范爷的美图吧。来源于网络。
    这方法速度太慢。

    电气专业的计算机萌新。写博文不容易。如果你觉得本文不错,请点个赞支持下,谢谢。

    展开全文
  • 按住鼠标左键即可绘制出一个长方形,而同时按住shift键则可绘制出正方形。 默认绘制出的矩形是自带填充色,双击图片或点击软件上方菜单栏中的“对象填充/线条颜色”可修改填充颜色。 选择对象工具后,在矩形处右击...

    我们在编写PDF文档时,除了文字和图片外,有时还需要用到一些矩形、圆形等几何图形要怎么操作呢?

    首先用极速PDF编辑器打开PDF文档或新建一个页面后,在软件左下角的画图工具中即可找到矩形工具。
    在这里插入图片描述

    注:如果没有看到此排工具栏则只需要在菜单栏任意处右击并勾选“画图和导航”取消隐藏即可。
    在这里插入图片描述

    按住鼠标左键即可绘制出一个长方形,而同时按住shift键则可绘制出正方形。

    默认绘制出的矩形是自带填充色,双击图片或点击软件上方菜单栏中的“对象填充/线条颜色”可修改填充颜色。
    在这里插入图片描述

    选择对象工具后,在矩形处右击并选择边框,可以为矩形添加边框。
    在这里插入图片描述

    或点击画图工具中的“边框切换”工具也可给矩形添加或移除边框。
    在这里插入图片描述

    如需插入圆形或其他不规则多边形可选择画图工具中对应工具操作即可。

    展开全文
  • 我是angular2和画布的新手,我正在尝试创建一个首先将图像绘制到画布上的组件,然后用户可以使用鼠标该图像上绘制矩形(以点击和拖动方式) . 这是我到目前为止几乎按预期工作的 .@Component({selector:'app-...
  • 使用canvas画布利用js通过鼠标实现矩形绘制(任意方向的绘制图形)(如果要绘制其他图形,做一点小改动就行了) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <...
  • 1.Opencv鼠标事件 回调函数使用: 响应函数使用: 2.绘制矩形ROI 2.1方法一 2.2方法二 3.绘制多边形ROI 参考: 1.使用鼠标图像上绘制矩形框或者多边形框 2.OpenCV-Python选择ROI(矩形和多边形)
  • 我希望可以lable中加载的一帧图像中通过点击鼠标左键开始绘制矩形按住左键拖动时改变矩形的形状,松开左键后完成绘制。(和lableImg软件类似)。 请问如何实现上述功能呢?我目前找到的方法是使用QPainter来...
  • 3. 鼠标绘制矩形按住左键拖动,选中并移动矩形 4. 选中矩形后鼠标选中矩形四个角按住拖动,可缩放矩形 效果预览 blog代码仅包含绘制画布部分,截图涉及列表展示、画布区域计算等,此处均省略,以一个...
  • python语言使用thinker制作的简易GUI,可通过鼠标拖拽或输入参数来绘制直线、矩形、圆。其中直线使用鼠标右击绘制有引力场的功能,当上一条直线的末端与本次直线的始端一定范围内,将会自动连接到一起。右击两次...
  • let activeShapePoints = [] let activeShape = undefined // 如果要画矩形,就赋值为 'rectangle' let drawingMode = 'circle'; // 按下鼠标左键 handler.setInputAction(function(movement) { activeShapePoints ...
  • 绘制矩形时按下SHIFT则绘制正方形

    千次阅读 2011-12-27 13:25:32
    //按下SHIFT时绘制正方形 if(GetKeyState(VK_SHIFT) & PRESSED) { double dDistX = tempPoint.x - StartPt.x; double dDistY = tempPoint.y - StartPt.y; //判断较短的边 if(fabs(dDistX) (dDistY)) {
  • 启用此插件后,用户只需按住鼠标左键并移动它,即可地图上绘制区域。 作为开发人员,您可以获取该区域边界框中的图层。 一旦有了图层的实例,就可以单独操作它们。 特征 轻松启用 轻松禁用它 物体周围画一个...
  • python-opencv实现绘制矩形roi区域

    千次阅读 2020-08-31 17:10:57
    def on_mouse(event, x, y, flags, param): #1.event是 CV_EVENT_*变量之一 2.x和y是鼠标指针图像坐标系的坐标(不是窗口坐标系) 3.flags是CV_EVENT_FLAG的组合, param是用户定义的传递到setMouseCallback函数...
  • 这篇博客将介绍鼠标事件,并介绍鼠标事件矩形、圆形的绘制; 1. 所有的鼠标事件(左键按下、左键释放、右键按下、右键释放、左键双击等); 2. 绘制随机半径、随机颜色圆形;...3. 绘制矩形、切换按键绘制圆形;
  • NAME, onmouse_draw_rect, draw_rects) while True: cv2.imshow(WIN_NAME, draw_rects.image_for_show) key = cv2.waitKey(30) if key == 27: # ESC break cv2.destroyAllWindows() 版本一的基础上加十字瞄准线 ...
  • 做项目越来越感觉到需要学的东西很多,但完成之后又觉得随着时间流逝,很多东西又变得模糊甚至是完全遗忘,所以此进行记录与梳理。参考的会放在下方的链接里 首先是实现图片显示鼠标移动的痕迹(左键按下后),...
  • Qt通过鼠标绘制线条、矩形、多边形本质都是根据鼠标的坐标位移,使用QPainter的自带的函数进行绘制。具体代码如下: graphicspainter.h #ifndef GRAPHICSPAINTER_H #define GRAPHICSPAINTER_H #include <QWidget...
  • 本次博文开始逐点击破,首先看下如何使用Solidworks软件进行草图的绘制,我们主要使用的是草图绘制工具,可以绘制包括直线、矩形、圆、槽、圆弧、圆角、点等,配合实际操作步骤,方便大家掌握。
  • 鼠标画布区域内绘制,移动,拖拽,删除矩形(如截图工具一般); isboundary() 判断是否需要判断边界问题,默认false。 效果截图 实现代码 vue页面 – 注意:原本canvas不支持键盘事件,为canvas加上tabindex=0...
  • 分析折线图时,某一段时间一个区间上下运动,这时绘制方形辅助分析。
  • 点击鼠标左键并拖动绘制矩形
  • VC++实现鼠标画矩形绘制直线,简单易实现
  • 绘制矩形:点击任意一点,拖动不放,到另一点,绘制完成 绘制正方形:和矩形类似,期间按住Shift键 绘制圆(椭圆):点击任意一点拖动 绘制三角形:先以画直线方式画一条直线,移动鼠标,会出现另两条虚线,点击完成...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,861
精华内容 2,344
热门标签
关键字:

在绘制矩形的同时按住