[opencv自学笔记]读写图像、视频和几何图形的绘制

news/2023/11/28 16:55:55

1、基本操作,图像、视频操作以及鼠标事件进行人机交互

import cv2
import numpy as npdef imageTest():'''测试opencv对二维图像的读取,复制和展示:return:'''path = "e:/images/1.JPEG"# cv2.read(path,flag)# 读取图像,第一个参数是文件路径,第二个参数是打开文件的方式# cv2.IMREAD_GRAYSCALE 以灰度图像打开# cv2.IMREAD_COLOR 以彩色图像打开,也就是RGB三通道,但是在opencv库是按照BRG的顺序!!# 返回值是一个列表,如果是灰度图像打开的话,返回的是每一行的灰度值列表,# 如果是以彩色图像打开的,返回的是每个像素点的三个通道的值,一行一行排列的# 如果路径错误,返回Noneimg = cv2.imread(path,cv2.IMREAD_COLOR)# cv2.imshow(winname,mat)# 用于在GUI显示图像,第一个参数是窗口名称,第二个参数是图像# 但是这个程序执行完之后就结束了,会一闪而过cv2.imshow("Image",img)# cv2.waitKey(delay)# 等待键盘事件,在delay毫秒内有没有键盘键入,如果有返回ASCII码,超过delay就退出了,返回0# 如果参数为0,则表示一直等待键盘事件,如果有键盘事件,则退出cv2.waitKey(0)# 可以关闭打开的窗口,不过cv2.waitKey(delay)已经退出了,不知道为什么还要加这句话cv2.destroyAllWindows()# cv2.imwrite(filename, img, params=None)# 用于图片复制,第一个参数为复制到哪# 第二个参数是要复制的图像,第三个参数是压缩级别,现在可以不用考虑,使用缺省参数就行cv2.imwrite("d:/windows/output.jpeg",img)def videoTest():'''测试opencv读取视频,显示视频,保存视频和打开摄像头操作:return:'''# cv2.VideoCaputure(param) 里面的参数是摄像头编号,# 0代表本机摄像头,如果有好几个,可以设置成1或者其他的cap = cv2.VideoCapture(0)# fourcc是一种视频编码格式,如果需要对摄像头的进行视频复制会使用到# cv2.VideoWriter(filename, fourcc, fps, frameSize[, isColor])# 第三个参数是frame per second 每秒多少帧# 最后一个参数是可选的,如果是True则是彩色图,False是灰度图fourcc = cv2.VideoWriter_fourcc('M','J','P','G')out = cv2.VideoWriter("D:/output.avi",fourcc,20.0,(640,480))# cap.read() 返回的是一个包含三个元素的元组,第一个元素是摄像头打开状态true或者false,# 第二个元素是当前一帧的数据(顺序是BRG),后面还有类型dtype,比如uint8编码,这个整体是第二个元素# 比如cap.read()的返回值是(Ture,array([[[174, 164, 155],#    [184, 174, 165],#    [176, 182, 176],.....,dtype=uint8))# cap.isOpened()方法是检测摄像头是否已经初始化了,换句话说,如果没有初始化,则需要初始化while(cap.isOpened()):ret,frame = cap.read()# 显示当前帧的图片cv2.imshow("camera",frame)# 等待用户键入,如果键入的不是q,则进行下一帧,如果是q退出# 当然你必须得键入,不键入的话肯定会一直等待的out.write(frame)key = cv2.waitKey(100)if(key == ord('q')):break# 释放资源cap.release()cv2.destroyAllWindows()def drawImageTest():'''测试用opencv画几何图形,比如人脸识别测试中,要在检测的人脸画个方框:return:'''# zeros(shape, dtype=None, order='C')# 先建立一个空的图片,并显示出来,# (512,512,3)前两个分别是长和宽,第三个参数代表图像的通道数,只能是1,3,4# 当然shape可以只写长和宽,那么就是单通道,也就是灰度图像img = np.zeros((512,512,3),np.uint8)# 画直线函数line(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)# 参数分别是原图像,一个点,另外一个点,画笔颜色(也是BRG的顺序),线的类型cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5)# 画矩形函数rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)# 画圆形函数circle(img, center, radius, color, thickness=None, lineType=None, shift=None)cv2.circle(img, (447, 63), 63, (0, 0, 255), -1)# 指定字体,写字函数,不支持中文font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img, 'OpenCV', (10, 500), font, 2, (255, 255, 255), 2)cv2.imshow("image",img)cv2.waitKey(0)def mouseEventTest():'''处理鼠标事件,进行人机交互,在grabcut用到了:return:'''# 查看cv2里面有多少个事件 有18种事件,其中跟鼠标事件相关的有,# 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP',# 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP',# 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL',# 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']# 其中L代表左键,R代表右键,M代表中间滚轮# CLK表示点击,DBLCLK代表双击# DOWN代表按下,UP代表释放# MOVE代表移动events = [i for i in dir(cv2) if 'EVENT' in i]num = len(events)# 建立一个名字为image的窗口并添加鼠标回调事件函数# 可以记录鼠标的轨迹cv2.namedWindow('image')cv2.setMouseCallback('image', drawByMouseEvent)while (1):cv2.imshow('image', img)k = cv2.waitKey(100) & 0xFFif k == ord('q'):break;img = np.zeros((512,512,3),np.uint8)
# 当鼠标按下时变为True
drawing=False
ix,iy=-1,-1
# 定义一个回调函数,相当于java里面的监听器,只要有对应的事件触发,就会执行
def drawByMouseEvent(event,x,y,flags,param):global ix,iy,mode,drawing# 左键按下if event == cv2.EVENT_LBUTTONDOWN:drawing = True# 鼠标移动并且左键按下elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:ix = xiy = yif drawing==True:cv2.line(img, (ix, iy), (x, y), (255, 0, 0), 5)# 鼠标左键释放elif event == cv2.EVENT_LBUTTONUP:drawing == Falsedef main():drawImageTest()if __name__ == '__main__':main()

摄像头那个函数就不贴执行结果了。。。。其它函数执行结果如下
imageTest函数执行结果如下(图片以我女神赵丽颖为例,贼漂亮):
这里写图片描述
drawImageTest函数执行结果如下:
这里写图片描述
mouseEventTest函数执行结果如下:
这里写图片描述

2、图像的一些属性和RBG通道分解与合并

import cv2
import numpy as npdef getImageInfo():path = "e:/images/1.JPEG"img = cv2.imread(path)# 获取横坐标和纵坐标为100的像素值,因为是彩色格式读取的,所以是BGR三个参数print(img[100, 100])# 获取横坐标和纵坐标为100的像素值的0通道,也就是B通道的值print(img[100, 100, 0])# shape属性是一个元组(width,height,channels)print(img.shape)# size属性返回像素个数,不仅仅是width*height,还要乘channelsprint(img.size)# dtype属性返回编码类型 如uint8print(img.dtype)# ROI,就是我们想处理的区域都叫ROI,其实就是像素点的集合,举例# 横坐标从280-340,纵坐标330-390的这段区域,类似于裁剪一样t = img[280:340,330:390]cv2.imshow("image",t)cv2.waitKey(0)def devideImageTest():'''一个彩色图像,假设是RGB三通道的,分解成三个单通道的:return:'''path = "e:/images/1.JPEG"img = cv2.imread(path)# img是三通道的,也就是说img本身是一个list,这个list是把像素点一行一行存放的,每一行也是一个list# 每一行的list里面存放各个位置的像素点,每个像素点都是按照[b,g,r]构成的list,# 因此img图像是一个三层中括号的list,也就是一个三位数组,第三维就是通道数,012对应bgr# 先看一下每个通道单独展示是什么结果cv2.imshow("origin", img)cv2.imshow("b", img[:, :, 0])cv2.imshow("g", img[:, :, 1])cv2.imshow("r", img[:, :, 2])# 假设把g通道全部变成零,原图像会怎么样?img[:,:,1] = 0cv2.imshow("image",img)cv2.waitKey(0)# 再把b通道全部变成零,原图像会怎么样?img[:, :, 0] = 0cv2.imshow("image", img)cv2.waitKey(0)# 再把r通道全部变成零,原图像会怎么样?img[:, :,2] = 0cv2.imshow("image", img)cv2.waitKey(0)def combineImageTest():'''一个彩色图像,成三个单通道的合成一个图像:return:'''path = "e:/images/1.JPEG"img = cv2.imread(path)g = img[:, :, 1]b = img[:, :, 0]r = img[:, :, 2]# 单通道图像cv2.imshow("b", b)cv2.imshow("g", g)cv2.imshow("r", r)# 合成merge(mv, dst=None)image = cv2.merge((b,g,r))cv2.imshow("merge",image)cv2.waitKey(0)def main():combineImageTest()if __name__ == '__main__':main()

devideImageTest函数执行结果如下:
这是去掉b通道之后的:
这是去掉b通道之后的
这是去掉b通道和g通道之后的:
这里写图片描述
去掉三个通道的(就是纯黑):
这里写图片描述

combineImageTest函数执行结果如下:
单独B通道的图:
这里写图片描述
单独G通道的图(好像G通道比B通道皮肤细致一些):
这里写图片描述
单独R通道的图(亮度大一些):
这里写图片描述
他们三个图都是单通道的图,单通道都是灰度图,并不是想象的红色,绿色,蓝色,那红绿蓝是啥,比如红吧,红是把R通道和B=0,G=0合成得到的,绿和蓝也是一样的,在这里不做演示。
最后,三个单通道合成的图(也就是原图):
这里写图片描述


http://www.ppmy.cn/news/595025.html

相关文章

速锐得耗资千万投入智能驾驶V8收集数据载体斩大单

2016年底,速锐得已经成为汽车行业CAN总线数据应用的领导者,该团核心人员队独具慧眼盯上了智能驾驶这产业的数据采集,耗资千万,历时2年推出智能驾驶V8汽车数据收集载体,斩获阿里、滴滴巨头订单,应用于智能驾…

使用Bert完成实体之间关系抽取

向AI转型的程序员都关注了这个号👇👇👇 机器学习AI算法工程 公众号:datayx 大创所需,所以写了一个模型用来完成关系抽取。 最后在百度DuIE数据集的完整测试集上达到95.37%正确率 效果: Source Text: 《在…

PaddleNLP系列课程一:Taskflow、小样本学习、FasterTransformer

文章目录 一、Taskflow1.1 前言1.2 Taskflow应用介绍1.2.1 词法分析1.2.2 命名实体识别1.2.3 文本纠错1.2.4 句法分析1.2.5 情感分析1.2.6 文本生成应用(三行代码体验 Stable Diffusion)1.2.7 使用技巧(保存地址、批量推理) 二、 …

【蜂口 | AI人工智能】人脸风格化——龙鹏 深度学习与人脸图像应用连载(九)

本次我们接着上一节内容继续分享,今天的分享内容是人脸风格化这个主题。同样我们将从以下几个方面给大家进行分享: 首先,我们会对风格化做一个简单的介绍。风格化到底是一个什么样的课题?在我们这里实际上包含了两层内容&#xf…

OpenCV(二)图像的载入,显示,和输出

一.OpenCV的命名空间 在写简单的OpenCV程序的时候&#xff0c;以下两句话是标配&#xff1a; #include<opencv2/opencv.hpp> using namespace cv;二.关于Mat类型 Mat类是用于保存图像以及其他矩阵数据的数据结构。对于这篇文章&#xff0c;我们用到关于Mat就是一句简单…

如何快速构建深度学习图像数据集

最近在实践人脸识别&#xff0c;目标检测等的项目&#xff0c;需要用到数据集的构建&#xff0c;从https://www.pyimagesearch.com/2018/04/09/how-to-quickly-build-a-deep-learning-image-dataset/找来资源&#xff0c;以供学习。我的项目地址&#xff1a;我的Github。 1、介…

3D人脸重建——PRNet网络输出的理解

前言 之前有款换脸软件不是叫ZAO么&#xff0c;分析了一下&#xff0c;它的实现原理绝对是3D人脸重建&#xff0c;而非deepfake方法&#xff0c;找了一篇3D重建的论文和源码看看。这里对源码中的部分函数做了自己的理解和改写。 国际惯例&#xff0c;参考博客&#xff1a; 什…

深度学习教你重建赵丽颖的三维人脸

作者 | 李秋键 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 近年来&#xff0c;三维人脸重建成为计算机视觉、图像识别等研究领域中的热点问题。三维人脸重建技术分为基于不同视角的多幅图像的重建和基于单幅图像的三维人脸重建。 本项目通过使用PRNet算法&#…

算法实战应用案例精讲-【图像处理】从图像读取到图像模糊处理(附python代码实现)

目录 一、opencv 图片读取和视频读取 环境搭建 1. 图片读取 2.视频读取

游戏设计参考:魔兽世界WOW角色的基本属性及其作用

游戏中的角色设有6项基本属性&#xff0c;分别是&#xff1a;力量、敏捷、耐力、智力、精神和精通。其中精通是在大地的裂变后新增的属性。基本属性影响着角色的各种能力&#xff0c;不同职业的角色需要注重的属性有所不同&#xff0c;例如战士需要特别留意力量&#xff1b;而法…

魔兽世界单机mysql修改怪物血量_魔兽世界单机版如何修改怪物掉落物品个数

怪物的掉落件数到底怎么改&#xff0c;纵观所有相关技术文章&#xff0c;没有一个说的清楚的&#xff0c;有说的也只是含糊带过&#xff0c;而且也没说要怎么改。 所以我干脆详细的发篇文章告诉大家具体的解决办法 首先你需要有个数据库查看工具&#xff0c;我用的是Navicat&am…

rp魔兽那个服务器人最多,魔兽世界怀旧服rp服务器什么意思 魔兽世界怀旧服rp是什么意思...

魔兽世界怀旧服rp服务器是玩家们想知道事情&#xff0c;游戏于8月27开服&#xff0c;很多玩家想知道魔兽世界怀旧服rp服务器什么意思、魔兽世界怀旧服rp是什么意思呢&#xff0c;跑跑车游戏网为大家带来介绍。 *魔兽世界怀旧服rp服务器什么意思&#xff1f; 魔兽世界国服于今日…

魔兽世界服务器名称修改,魔兽世界怀旧服新增6组服务器 新服务器名称一览

魔兽世界怀旧服公布以来十分火热&#xff0c;可以创建角色后玩家蜂拥而至去创建角色&#xff0c;以至于服务器爆满。《魔兽世界》官方今天宣布8月27日凌晨01:00起再新增6组服务器&#xff0c;同时移除怀旧服每个账号创建至多三个游戏角色的限制&#xff0c;一起来了解一下吧。 …

魔兽服务器联盟在线,《魔兽世界》怀旧服再开新服,部落联盟泾渭分明?

原标题&#xff1a;《魔兽世界》怀旧服再开新服&#xff0c;部落联盟泾渭分明&#xff1f; 2月13号早间&#xff0c;《魔兽世界》经典怀旧服再次开放了两组全新的服务器——光芒与无畏&#xff0c;旨在缓解因为新内容上线而暴涨的在线人数。新服务器开放之后&#xff0c;排队问…

魔兽世界最新服务器人数,魔兽世界过气?全球服务器人口普查带你了解真正的魔兽世界现状...

从魔兽世界从巫妖王版本的巅峰之后人数下滑开始&#xff0c;玩家们就一直认为魔兽世界是一款过气老游戏&#xff0c;到了今天这款游戏已经走过了14个年头&#xff0c;哪怕是8.0版本吸引了大批量的玩家回归&#xff0c;一些早早离开魔兽世界或者对魔兽世界不了解的人更是认为魔兽…

为什么魔兽世界不显示服务器列表,魔兽世界为什么转移服务器时没有显示时光之穴服务器。 我都有角色在时光之穴了...

合并原则 由于各区的PVE与PVP服务器数量不同、服务器人口不同&#xff0c;因此我们将针对不同的区给予不同的合并计划&#xff0c;选取最合适的服务器进行合并&#xff0c;以确保玩家在合并服务器后获得最佳的游戏享受和游戏体验。 角色数量限制 由于在每个服务器上创建的角色数…

魔兽插件修改服务器名字,《私人定制》如何制作自己心仪的插件

本文来源于NGACN,作者:伊甸外 第一部分 前提: 一份好奇心, 一份决心, 一点点的强迫症, 一个高一水平的英语基础, 一个叫做Notepad++的软件。[Notepad++下载地址] 第二部分 首先,你需要知道插件在哪里,即与插件有关的有两个大文件夹:Interface和WTF。你若懂得这些,可…

【魔兽世界】WLK版本的常规宏教程

文章目录 宏 常规指令和语法 基础指令 队列施法 攻击 动作条 取消 目标选择 模拟点击 图标及提示 判断条件 在不失去当前目标的情况下&#xff0c;定位另一目标 语法 注意事项 宏例子 上马跟随宏 神牧攻击宏 牧师驱散宏 我的常用指令及判断 指令 重置宏条…

魔兽点人名不显示服务器,魔兽世界怀旧服公布八个服务器名字,玩家:还能更难听点吗?...

自2017年暴雪嘉年华上公布《魔兽世界》官方怀旧版本的消息以来&#xff0c;全球玩家们对此深怀期待。 最近的事件从8月9日凌晨2点的服务器压力测试开始&#xff0c;网上有人称怀旧服不会火&#xff0c;月卡劝退等&#xff0c;还有担忧各种GZS的渗入会影响游戏体验&#xff0c;尽…

角色在服务器正在维护,魔兽怀旧服:服务器再次崩溃,角色全部消失,需要维护14个小时...

前言&#xff1a;怀旧服服务器因为玩家数量太多&#xff0c;稳定性一直是一个问题&#xff0c;因为服务器崩溃已经不是一次两次了&#xff0c;就在昨天夜里又再次发生了&#xff0c;并且这次更加严重。昨天晚上有熬夜的玩家&#xff0c;都经历了服务器的再次崩溃&#xff0c;所…
最新文章