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

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

opencv 鼠标事件

1.opencv 鼠标事件类型

import cv2d=[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 cv2global img
global point1, point2#鼠标响应函数
def Rectangular_box(event, x, y, flags, param):global img, point1, point2img2 = 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 imgimg = 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 cv2import numpy as nppts = []  # 用于存放点
# 统一的: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))  # 用于求 ROImask3 = 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()

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

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

opencv进阶学习笔记6:使用鼠标在图像上绘制矩形框或者多边形框相关推荐

  1. opencv进阶学习笔记2:numpy操作图像,色彩空间,查找指定颜色范围,通道分离与合并

    基础部分传送门 python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录: python+opencv进阶版学习笔记目录(适合有一定基础) Numpy操作图像 1.遍历图像每一 ...

  2. opencv学习笔记(八)-- 在图像上绘制形状和文字

    文章目录 CV::Point以及CV::Scalar 画直线cv::line() 画椭圆cv::elipse() 画矩形cv::rectangle() 画圆cv::circle() 画填充多边形cv: ...

  3. opencv进阶学习笔记3:像素运算和图像亮度对比度调节

    基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版目录: python+opencv进阶版学习笔记目录(适合有一定基础) 像素运算 要求两张图大小,以及格式(np ...

  4. python鼠标画点连线_使用Matplotlib在Python中使用鼠标在图像上绘制点

    我试图用鼠标在图像上绘制点. 问题是:图像出现了,但是当我点击鼠标时,什么也没有绘制出来(即使我点击了几次).在 我的Python版本是python2.7,带有Anaconda和IPython控制台. ...

  5. opencv进阶学习笔记14:分水岭算法 实现图像分割

    基础版学习笔记目录: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 分水岭算法原理 分水岭算法 ...

  6. opencv进阶学习笔记13:图像形态学操作大全(膨胀,腐蚀,开闭,黑帽,顶帽,梯度)python版

    基础版学习笔记: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 基础版形态学: opencv学 ...

  7. opencv进阶学习笔记12:轮廓发现和对象测量

    基础版笔记目录: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 轮廓发现 1轮廓发现介绍 基础 ...

  8. opencv进阶学习笔记11:cannny边缘检测,直线检测,圆检测

    基础版笔记传送门 python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) cannny边缘检测 基础版边 ...

  9. opencv进阶学习笔记10:图像金字塔和图像梯度

    基础版笔记传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 图像金字塔 变小 变大 原理 ...

最新文章

  1. 用JavaScript写Session的两种方法
  2. PB中如何调用shellExecute
  3. 60.extjs-布局 (在column布局中使用fieldset 和 在fieldset中使用column布局)
  4. python写520_用Python做一个520表白神器,值得收藏
  5. Local Database Overview for Windows Phone
  6. Java同步(Synchronization)
  7. Python pip下载包时候出现下载中断,超时的情况
  8. React脚手架配置代理解决跨域
  9. 常用MATLAB工具箱下载地址
  10. Android开发岗位要求集锦
  11. matlab海龟交易策略,海龟交易策略
  12. PPT文件带有打开密码怎么解决
  13. 【原创】图像处理第5弹:面部表情识别--微笑
  14. 7-67 计算年龄 (10 分)
  15. CAD中样条曲线Spline怎样才能分解成多段弧arc?
  16. Word-embeding 【paper】
  17. csgo删除机器人_《CS:GO》更新移除补位机器人并调整地图和修复bug
  18. 网站遭到恶意攻击有什么危害
  19. 华为WATCH GT 3和其他品牌手表比怎么样
  20. Redis(十六),mysql索引面试题索引失效

热门文章

  1. C#——《C#语言程序设计》实验报告——数据库编程——基于ADO.NET技术和WPF技术的简单数据库可视化工具DEMO
  2. Vue——整合与中文化Moment.js解决方案
  3. Visual C++——LoadBitmap加载位图的操作过程
  4. Ehab Is an Odd Person
  5. 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及总结
  6. SpringBoot Quartz 定时任务详解
  7. 求1~n的全排列组合
  8. Unity3D研究院之IOS触摸屏手势控制镜头旋转与缩放
  9. NIO 之 ByteBuffer实现原理
  10. java中sc的快捷键,Windows下的SC命令参考