基础到进阶,跨度有点大,我们还是先踏实基础吧。对图像的处理实际上还是对图像像素矩阵的处理,当然还需要点想象空间。上一篇文章我们介绍了opencv的最基本用法,能够实现图片的加载、生成、读取像素矩阵、三通道分解等,详见:

peter.cao:图像处理之OpenCV的基础使用​zhuanlan.zhihu.com

下面继续基础知识的应用实践。需要说明一下的是,在写下这些文字的过程中主要参考的是opencv的官方文档,如下为其链接:

OpenCV-Python Tutorials​docs.opencv.org

  1. 给图形增添简单元素

这里添加简单元素不是改变某一个范围的像素值,而是在已有图形上来添加线、矩形、园等元素。在添加的时候应该就是改变元素轨迹上的原有点像素值。

案例1:添加一条直线,使用cv2.line()函数

cv2.line(img,sp,ep,color,thickness,linetype): img就是目标图,sp为起始坐标,ep为终点坐标,color为颜色,thickness为线的粗细,linetype为线型。

import numpy as np
import cv2
img0= np.array(np.ones((300,300,3),dtype=np.uint8))   #构建一个三通道都是1的像素矩阵
cv2.line(img0,pt1=(10,10),pt2=(200,200),color=(255,0,0))   #在img0上绘制一条直线
cv2.imshow('line',img0)
cv2.waitKey(0)

执行效果为:

案例2:添加一个矩形,使用cv2.rectangle函数

cv2.rectangle(img,sp,ep,color,thickness,linetype): img就是目标图,sp为起始坐标,ep为终点坐标,color为颜色,thickness为线的粗细,linetype为线型。参数与line函数一样。

import numpy as np
import cv2
img0= np.array(np.ones((300,300,3),dtype=np.uint8))
cv2.line(img0,pt1=(10,10),pt2=(200,200),color=(255,0,0))
cv2.rectangle(img0,pt1=(40,40),pt2=(200,200),color=(0,255,0))  #绘制一个矩形框
cv2.imshow('line',img0)
cv2.waitKey(0)

执行效果为:

案例3:添加一个园,使用cv2.circle函数

cv2.circle(img,center,radius,color,thickness,linetype): img就是目标图,center为园中心坐标,radius为园半径,color为边界颜色,thickn为边界粗细,linetype为边界线型。

import numpy as np
import cv2
img0= np.array(np.ones((300,300,3),dtype=np.uint8))
cv2.line(img0,pt1=(10,10),pt2=(200,200),color=(255,0,0))
cv2.rectangle(img0,pt1=(40,40),pt2=(200,200),color=(0,255,0))
cv2.circle(img0,center=(50,50),radius=20,color=(0,0,255))  #绘制一个圆形
cv2.imshow('line',img0)
cv2.waitKey(0)

执行效果如下:

从上述执行效果看到,对于cv2的颜色模型,三通道顺序为BGR,而不是RGB,这一点需要注意一下。

案例4:添加标注,可以使用putText函数

putText(img,text,org,fontFace,fontScale,color,thickness,lineType): text为标注的文字内容,org为起始的坐标,fontFace为字体类型,fontScale为字体比例倍数,color为颜色,thickness为字体线型宽度,lineType为线型。

import numpy as np
import cv2
img0= np.array(np.ones((300,300,3),dtype=np.uint8))
cv2.line(img0,pt1=(10,10),pt2=(200,200),color=(255,0,0))
cv2.rectangle(img0,pt1=(40,40),pt2=(200,200),color=(0,255,0))
cv2.circle(img0,center=(50,50),radius=20,color=(0,0,255))
cv2.putText(img0,text='topher',org=(50,100),fontFace=cv2.FONT_HERSHEY_COMPLEX,fontScale=2,color=(255,0,0),thickness=2,lineType=cv2.LINE_AA)
cv2.imshow('line',img0)
cv2.waitKey(0)

执行效果如下:

2. 给鼠标添加事件

鼠标主要是点击事件和滑动,比如左键点击、左键双击、右键点击、中键滑动等,可以在代码里输入cv2.EVENT,根据pycharm的代码补全功能,就会将后续的函数全称显示出来,如下:

如图大概有十几个鼠标事件,包括了左键、中键和右键三个部分。

可以写一个专门用于鼠标测试的函数,对各个点击事件进行测试说明:

# mouse callback function
def mouse_event(event, x, y, flags, param):''':param event: 点击事件标识:param x: 坐标x:param y: 坐标y:param flags:按键事件标识:param param: 携带参数:return:'''if flags == cv2.EVENT_FLAG_ALTKEY:print('摁住Alt')if flags == cv2.EVENT_FLAG_CTRLKEY:print('摁住Ctrl')if flags == cv2.EVENT_FLAG_SHIFTKEY:print('摁住Shift')if flags == cv2.EVENT_FLAG_LBUTTON:print('摁住左键')if flags == cv2.EVENT_FLAG_MBUTTON:print('摁住中键')if flags == cv2.EVENT_FLAG_RBUTTON:print('摁住右键')if event == cv2.EVENT_LBUTTONDBLCLK:print('左键双击')if event == cv2.EVENT_MBUTTONDBLCLK:print('中键双击')if event == cv2.EVENT_RBUTTONDBLCLK:print('右键双击')if event == cv2.EVENT_LBUTTONDOWN:print('左键击下')if event == cv2.EVENT_LBUTTONUP:print('左键弹起')if event == cv2.EVENT_MBUTTONDOWN:print('中键击下')if event == cv2.EVENT_MBUTTONUP:print('中键弹起')if event == cv2.EVENT_RBUTTONDOWN:print('右键击下')if event == cv2.EVENT_RBUTTONUP:print('右键弹起')if event == cv2.EVENT_MOUSEWHEEL:if flags > 0:print('向前滚动')else:print('向后滚动')if event == cv2.EVENT_MOUSEHWHEEL:if flags > 0:print('向左滚动')  # 按住Altelse:print('向右滚动')if __name__ == '__main__':img = np.mat(np.zeros((300, 300, 3), np.uint8))  # 构造一个像素值全为1的图形cv2.namedWindow('mouse')    #命名窗口为mousecv2.setMouseCallback('mouse', mouse_event)  # 窗口与回调函数绑定while True:cv2.imshow('mouse', img)if cv2.waitKey(1) & 0xFF == ord('q'):  # 摁下q退出breakcv2.destroyAllWindows()            #销毁所有窗口

执行程序后,就可以在弹出的黑色窗口里对鼠标事件进行测试,测试时会在终端打印鼠标事件名称。下面结合添加简单元素效果进行示例。

案例1:鼠标左键双击时绘制一个圆形

使用函数cv2.EVENT_LBUTTONDBLCLK触发,我们可以直接将上述代码修改一下:

def draw_circle(event,x,y,flags,param):if event == cv2.EVENT_LBUTTONDBLCLK:  #鼠标为左键双击时cv2.circle(img,(x,y),100,(255,0,0))   #画一个半径为100,边界颜色为蓝色的园,后面如果增加-1参数,表示填充if __name__ == '__main__':img = np.zeros((300, 300, 3), np.uint8)  # 构建一个300x300黑色背景图cv2.namedWindow('test')cv2.setMouseCallback('test', draw_circle)  # 窗口与回调函数绑定while(1):cv2.imshow('test', img)if cv2.waitKey(10)& 0xFF == 27:    #按ESC键退出  breakcv2.destroyAllWindows()

这段代码中,draw_circle函数参数里x和y默认取得鼠标当前所在的位置,

cv2.waitKey(10)& 0xFF == 27: 其中waitKey前面介绍过,等待按键,参数10表示读帧间隔时间,当为10时表示每隔10s读一下图,因为这里只有一张图,实际上这个取值变化影响不大,而本身waiKey是一个动作,等待按键期间如果没有按键,返回-1,如果有按键,返回按键的ASCII码;0xFF是十六进制表示,cv2.waitKey(10)& 0xFF是一个逻辑与运算,waitKey()是有返回值的,当这个返回值与0xFF进行逻辑与操作时,得到的值如果为27,对应的按键就是ESC。

执行代码后,当鼠标在任意位置双击时就可以绘制出圆形来。这里点击了4次,效果如下:

案例2:在案例1基础上增加一个右键点击按钮事件,绘制一个矩形

增加右键单击函数cv2.EVENT_RBUTTONDOWN,如下:

def draw_circle(event,x,y,flags,param):if event == cv2.EVENT_LBUTTONDBLCLK:cv2.circle(img,(x,y),100,(255,0,0))elif event == cv2.EVENT_RBUTTONDOWN:cv2.rectangle(img,(x,y),(x+100,y+50),color=(0, 255, 0))if __name__ == '__main__':img = np.zeros((500, 500, 3), np.uint8)  # 500x500黑色背景cv2.namedWindow('test')cv2.setMouseCallback('test', draw_circle) while(1):cv2.imshow('test', img)if cv2.waitKey(10)& 0xFF == 27:    #按ESC键退出  breakcv2.destroyAllWindows()

执行后效果如下:

opencv 画矩形_图像处理之OpenCV的基础使用补充相关推荐

  1. python图像识别 车牌_[图像处理] Python+OpenCV实现车牌区域识别

    点击上方蓝色字体,关注我们 15 本篇文章主要调用OpenCV库(cv2)进行车牌区域识别,具体步骤包括: 1.灰度转换:将彩色图片转换为灰度图像,常见的R=G=B=像素平均值. 2.高斯平滑和中值滤 ...

  2. python opencv 直方图均衡_深入理解OpenCV+Python直方图均衡化

    原标题:深入理解OpenCV+Python直方图均衡化 正文 直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法. 基本思想:把原始图的直方图变换为均匀分 布的形式,这样就增加了像素灰度 ...

  3. java opencv 平移_如何使用opencv pnpRansac()函数中的平移矩阵和旋转矩阵设置Rajawali相机的旋转?...

    我正在开发Android AR应用程序 . 我正在使用RAJAWALI库进行AR渲染,使用openCV进行目标检测和跟踪 . 我正在使用opencv的PNPRansac函数计算旋转和平移矩阵 . cv ...

  4. python opencv直方图_【python opencv】直方图均衡

    搜索热词 考虑这样一个图像,它的像素值仅局限于某个特定的值范围.例如,较亮的图像将把所有像素限制在高值上.但是一幅好的图像会有来自图像所有区域的像素.因此,您需要将这个直方图拉伸到两端(如下图所示,来 ...

  5. python opencv 三维重建_【python+opencv实现基于图片序列的三维重建】 - #1

    2015年09月05 - 三维重建一直是机器视觉研究的热门方向,比如,基于双目视觉,单目视觉,多视几何,光场三维重建等等. 每一种方法都有其有点和局限性.单目视觉需要拍摄多幅图像,并且在拍摄过程中需要 ...

  6. python识别图像中绿色的部分_[OpenCV-Python] OpenCV 中的图像处理 部分 IV (四)

    部分 IV OpenCV 中的图像处理 21 OpenCV 中的轮廓 21.1 初识轮廓 目标 • 理解什么是轮廓 • 学习找轮廓,绘制轮廓等 • 函数:cv2.findContours(),cv2. ...

  7. 【CV春季划】170分钟学习OpenCV与经典图像处理算法基础

    本次给大家带来的是有三AI-CV春季划组OpenCV与经典图像处理算法的直播回放,如果你还不知道有三AI-CV春季划是什么,可以看下面的视频和图文. 点击边框调出视频工具条 [CV春季划]言有三手把手 ...

  8. OpenCV与图像处理学习一——图像基础知识、读入、显示、保存图像、灰度转化、通道分离与合并

    OpenCV与图像处理学习一--图像基础知识.读入.显示.保存图像.灰度转化.通道分离与合并 一.图像基础知识 1.1 数字图像的概念 1.2 数字图像的应用 1.3 OpenCV介绍 二.图像属性 ...

  9. OpenCV-Python实战(1)——OpenCV简介与图像处理基础

    OpenCV-Python实战(1)--OpenCV简介与图像处理基础 OpenCV介绍 Python安装OpenCV OpenCV主要模块 OpenCV应用场景 OpenCV图像处理基础 图像基础 ...

最新文章

  1. GHOST重装系统只剩一个C盘 数据恢复方法
  2. html5 实现坦克大战,HTML5实现坦克大战(一)
  3. Yii学习笔记之二(使用gii生成一个简单的样例)
  4. LAMP源代码编译整理
  5. Quartz学习资料地址记录 、Quartz 学习的博客地址记录
  6. 计算机视觉论文-2021-06-30
  7. 我们每天努力上班赚钱,财富离我们很远
  8. 高效Redis Client多线程操作的并发吞吐设计
  9. 高斯低通滤波 matlab_一维和二维高斯函数及其一阶和二阶导数
  10. 全球著名营销专家怎么评价这本书
  11. 频繁模式挖掘apriori算法介绍及Java实现
  12. J2EE JavaEE 教程系列
  13. PHP目录函数 opendir (打开目录句柄)
  14. 超实用的HTML 5接口全方位测试总结文
  15. tx关于机器人的律师函_酷q、晨风等第三方机器人被封杀停运,余者纷纷跑路!...
  16. 天龙八部服务器维护几点开服,天龙八部开服时间表2020-开服时间表一览
  17. Cadence Allegro修改图纸尺寸和栅格大小图文教程及视频演示
  18. 在猎豹浏览器中使用360邮件通
  19. 台式计算机各种接口的名称,值得收藏的电脑接口大全(图文版)
  20. 阅读笔记 - Horizon Zero Dawn 广袤世界中的玩家漫游

热门文章

  1. [云炬创业管理笔记]第二章测试4
  2. [云炬创业基础笔记]第五章创业机会评估测试1
  3. 科大星云诗社动态20210520
  4. 云炬Android开发笔记 13购物车,订单,支付功能开发(包含支付宝支付和微信支付)
  5. 基于贝叶斯决策理论的分类器
  6. 最简单的制作从USB启动的系统的方法
  7. 转 ajax.dll 与 ajaxpro.dll的用法
  8. delphi中move函数的用法
  9. 多工作线程获取工作队列简单实现
  10. 在汇编程序中调用C函数