OpenCV基础操作(1)图片及视频基础操作、常用绘图函数

news2024/11/19 2:25:25

OpenCV基础操作(1)图片、视频、绘图函数

import cv2 as cv
import numpy as np

1、图像的读取、显示、保存

'''
使用函数 cv2.imread() 读入图像。
第一个参数是幅图路径,
第二个参数是要告诉函数应该如何读取这幅图片。
• cv2.IMREAD_COLOR(1):读入一副彩色图像。图像的透明度会被忽略,这是默认参数。
• cv2.IMREAD_GRAYSCALE(0):以灰度模式读入图像
• cv2.IMREAD_UNCHANGED(-1):读入一幅图像,并且包括图像的 alpha 通道
'''

img = cv.imread('./img.jpg',cv.IMREAD_GRAYSCALE)
print(type(img),img.shape)
<class 'numpy.ndarray'> (494, 650)
'''
使用函数 cv2.imshow() 显示图像。窗口会自动调整为图像大小。
第一个参数是窗口的名字,其次才是我们的图像。
你可以创建多个窗口,只要你喜欢,但是必须给他们不同的名字

cv2.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫秒级。
函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运行。
如果没有键盘输入,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会无限期的等待键盘输入。

cv2.destroyAllWindows() 可以轻易删除任何我们建立的窗口。
如果你想删除特定的窗口可以使用 cv2.destroyWindow(),在括号内输入你想删除的窗口名
'''
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()
'''
一种特殊情况是, 你也可以先创建一个窗口, 之后再加载图像。
这种情况下, 你可以决定窗口是否可以调整大小。
使用到的函数是cv2.namedWindow()。
初始设定函数标签是cv2.WINDOW_AUTOSIZE。
但是如果你把标签改成cv2.WINDOW_NORMAL,你就可以调整窗口大小了。
'''
cv.namedWindow('image',cv.WINDOW_NORMAL)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()
'''
保存图像
'''

cv.imwrite('new_img.jpg',img)
True
'''
程序将会加载一个灰度图,显示图片,按下’s’键保存后退出,或者按下 ESC(k=27) 键退出不保存。
'''

img = cv.imread('img.jpg',cv.IMREAD_GRAYSCALE)
cv.imshow('image',img)
k = cv.waitKey(0)
print(k)
if k == 27:
    cv.destroyAllWindows()
elif k == ord('s'):
    cv.imwrite('new.jpg',img)
    cv.destroyAllWindows()
115

2、使用matplotlib显示图像

from matplotlib import pyplot as plt

img = cv.imread('img.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()


在这里插入图片描述

'''
彩色图像使用 OpenCV 加载时是 BGR 模式。但是 Matplotib 是 RGB模式。
所以彩色图像如果已经被 OpenCV 读取,那它将不会被 Matplotib 正确显示。

如下图,与原图相比,在颜色上有很大改变
'''

img = cv.imread('img.jpg')
plt.imshow(img)
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()


在这里插入图片描述

'''
下面介绍几种解决方式:

第一种方式,利用cv2的merge函数手动去合并。
'''
img = cv.imread('img.jpg')
b,g,r = cv.split(img)
img = cv.merge([r,g,b])

plt.imshow(img)
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()


在这里插入图片描述

'''
第二种方式,利用cv2提供的BGR2RGB函数
'''
img = cv.imread('img.jpg')
img = cv.cvtColor(img,cv.COLOR_BGR2RGB)

plt.imshow(img)
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()


在这里插入图片描述

'''
第三种方式,利用矩阵的翻转。(推荐)
因为图像本身就是一个矩阵,所以可以直接利用矩阵操作实现图像通道的变换。
恰好opencv的[B,G,R] 与matplotlib的[R,G,B]刚好是逆序,所以可以很方便的利用矩阵的逆序操作。
'''
img = cv.imread('img.jpg')
img = img[:, :, ::-1]

plt.imshow(img)
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()


在这里插入图片描述

3、视频的读取及显示

'''
1、使用摄像头来捕获视频

我们经常需要使用摄像头捕获实时图像。OpenCV 为这中应用提供了一个非常简单的接口。
我们使用摄像头来捕获一段视频,并把它转换成灰度视频显示出来。
'''


'''
你可以使用函数 cap.get(propId) 来获得视频的一些参数信息。这里propId 可以是 0 到 18 之间的任何整数。每一个数代表视频的一个属性。

其中的一些值可以使用 cap.set(propId,value) 来修改,value 就是你想要设置成的新值。
例如,可以使用 cap.get(3) 和 cap.get(4) 来查看每一帧的宽和高。默认情况下得到的值是 640X480。
但是我可以使用 ret=cap.set(3,320)和 ret=cap.set(4,240) 来把宽和高改成 320X240
'''

cap = cv.VideoCapture(0)

while(True):
    # 一帧一帧的捕获
    # ret 返回一个布尔值(True/False)。如果帧读取的是正确的,就是 True。
    # 所以最后你可以通过检查他的返回值来查看视频文件是否已经到了结尾。
    # frame 是numpy.ndarray
    ret, frame = cap.read()

    # 将图像准换为灰度图
    gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)

    # 一帧一帧的展示出来
    cv.imshow('frame',gray)

    # 输入q结束捕获
    k = cv.waitKey(1)
    if  k & 0xFF == ord('q'):
        break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()
640.0
480.0
'''
2、从文件中播放视频

在播放每一帧时,使用 cv2.waiKey() 设置适当的持续时间。如果设置的太低视频就会播放的非常快,如果设置的太高就会播放的很慢
(你可以使用这种方法控制视频的播放速度)。通常情况下 25 毫秒就可以了。
'''

cap = cv.VideoCapture(0)


'''
在我们捕获视频,并对每一帧都进行加工之后我们想要保存这个视频。
对于图片来时很简单只需要使用 cv2.imwrite()。但对于视频来说就要多做点工作。

要创建一个 VideoWriter的对象。
确定一个输出文件的名字。
接下来指定 FourCC 编码。
播放频率和帧的大小也都需要确定。
最后一个是 isColor 标签。如果是 True,每一帧就是彩色图

'''
# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi',fourcc, 20.0, (640,480))


while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv.flip(frame,0)

        # write the flipped frame
        out.write(frame)

        cv.imshow('frame',frame)
        if cv.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()

4、OpenCV中的常用绘图函数

cv2.line(),cv2.circle(),cv2.rectangle(),cv2.ellipse(),cv2.putText()

上面所有的这些绘图函数需要设置下面这些参数:

  • img:你想要绘制图形的那幅图像。
  • color:形状的颜色。以 RGB 为例,需要传入一个元组,例如:(255,0,0)代表蓝色。对于灰度图只需要传入灰度值。
  • thickness:线条的粗细。如果给一个闭合图形设置为 -1,那么这个图形就会被填充。默认值是 1.
  • linetype:线条的类型,8 连接,抗锯齿等。默认情况是 8 连接。cv2.LINE_AA为抗锯齿,这样看起来会非常平滑。
'''
1、画线
'''
img = np.zeros((512,512,3), np.uint8)
cv.line(img,pt1 = (0,0),pt2 = (511,511),color=(255,0,0),thickness = 5)
winname = 'example'
cv.namedWindow(winname)
cv.imshow(winname, img)
cv.waitKey(0)
cv.destroyWindow(winname)
'''
2、矩形

需要告诉函数的左上角顶点pt1和右下角顶点的坐标pt2。
'''
img = np.zeros((512,512,3), np.uint8)
cv.rectangle(img,pt1 = (10,10), pt2 = (200,100),color=(0,255,0),thickness = 5)
winname = 'example'
cv.namedWindow(winname)
cv.imshow(winname, img)
cv.waitKey(0)
cv.destroyWindow(winname)
'''
3、要画圆的话,只需要指定圆形的中心点坐标center(宽度,长度)和半径大小radius。
'''
img = np.zeros((512,512,3), np.uint8)
cv.circle(img, center = (200,200), radius = 150,color=(0,0,255),thickness = 5)
winname = 'example'
cv.namedWindow(winname)
cv.imshow(winname, img)
cv.waitKey(0)
cv.destroyWindow(winname)
'''
4、画椭圆比较复杂,我们要多输入几个参数。

一个参数是中心点的位置坐标center
下一个参数是长轴和短轴的长度axes
椭圆沿逆时针方向旋转的角度angle
椭圆弧演顺时针方向起始的角度startAngle和结束角度endAngle,如果是 0 很 360,就是整个椭圆。
'''
img = np.zeros((512,512,3), np.uint8)
cv.ellipse(img, center = (200,200), axes = (100,50),
           angle = 45,startAngle = 0,endAngle = 270,
           color=(0,0,255),thickness = -1)
winname = 'example'
cv.namedWindow(winname)
cv.imshow(winname, img)
cv.waitKey(0)
cv.destroyWindow(winname)
'''
5、绘制多边形


画多边形,需要指点每个顶点的坐标。
用这些点的坐标构建一个大小等于行数 X1X2 的数组,行数就是点的数目。这个数组的数据类型必须为 int32。

isClosed是 False,我们得到的多边形是不闭合的(首尾不相连)
'''
img = np.zeros((512,512,3), np.uint8)
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
print(pts.shape)

cv.polylines(img,[pts],isClosed = False,color=(0,0,255),thickness = 5)
winname = 'example'
cv.namedWindow(winname)
cv.imshow(winname, img)
cv.waitKey(0)
cv.destroyWindow(winname)
'''
6、在图片上添加文字

要在图片上绘制文字,你需要设置下列参数:
• 你要绘制的文字text
• 你要绘制的位置org
• 字体类型fontFace(通过查看 cv2.putText() 的文档找到支持的字体)
• 字体的大小fontScale
• 文字的一般属性如颜色,粗细,线条的类型等。为了更好看一点推荐使用lineType=cv2.LINE_AA。

'''
img = np.zeros((512,512,3), np.uint8)

font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,text='OpenCV',org=(10,400), fontFace=font, fontScale=4,
           color = (255,255,255),thickness = 2,lineType=cv.LINE_AA)
winname = 'example'
cv.namedWindow(winname)
cv.imshow(winname, img)
cv.waitKey(0)
cv.destroyWindow(winname)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/545074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模板字符串、startsWith()方法和endsWith()方法、repeat()、Set数据结构、Set对象实例方法、遍历Set

模版字符串 ES6新增的创建字符串的方式,使用反引号定义 示例 <script>// 1.模板字符串可以解析变量 ${}显示变量的值let name 张三;let sayHello HEllo,我的名字叫${name};console.log(name);console.log(sayHello);let result {name: "zhangsan",age: 20…

激光切割机在使用过程中常见故障有哪些(一)

由于不少客户在使用光纤激光切割机的过程中&#xff0c;因为操作不当等原因&#xff0c;造成激光切割机出现一些小故障&#xff0c;这些故障虽然不大&#xff0c;但是却会对正常使用工期造成延误&#xff0c;甚至造成损失&#xff0c;所以了解光纤激光切割机的常见故障迫在眉睫…

本地电脑远程服务器,复制大文件报:未指定错误的解决办法

1、本地电脑快捷键WINR 打开运行窗口 2、输入 \\IP地址\磁盘$。如下&#xff1a; 3、上一步点击确定&#xff0c;即远程到了相应的磁盘&#xff0c;可在本地进行复制粘贴。

北京打响大模型地方战第一枪:公布通用人工智能发展21项措施

21项&#xff01;北京就促进AGI创新发展措施征集意见。 作者 | 李水青 来源 | 智东西 ID | zhidxcom 智东西5月16日消息&#xff0c;近日&#xff0c;《北京市促进通用人工智能创新发展的若干措施&#xff08;2023-2025年&#xff09;&#xff08;征求意见稿&#xff09;》…

【C++】基础知识--程序的结构(1)

C简介&#xff1a; C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言&#xff0c;支持过程化编程、面向对象编程和泛型编程。 C 被认为是一种中级语言&#xff0c;它综合了高级语言和低级语言的特点。 C 是由 Bjarne Stroustrup 于 1979 年在新泽西州…

Codeforces Round 873 (Div. 2) 题解

5.18晚VP&#xff0c;共AC三题&#xff0c;ABC题&#xff0c;感觉难度还是挺大的&#xff0c;做起来一点也不顺手。。。A题秒出&#xff0c;卡在了B题&#xff0c;在B题花费了好多时间&#xff0c;还没有C题做得顺利。。。B题开始想错了&#xff0c;思路不对&#xff0c;但确实…

LeetCode225.用队列实现栈

&#x1f4ad;前言&#xff1a; 建议本题和LeetCode232对比实现 syseptember的个人博客&#xff1a;LeetCode232.栈模拟队列http://t.csdn.cn/HCEDg 题目 思路 ❗注意&#xff1a;本题的逻辑结构是栈&#xff0c;物理结构是队列&#xff0c;我们需要通过2个队列模拟栈的操作。…

Doxygen源码分析:构建过程简介,并生成doxygen自身的C++文档

2023-05-19 11:52:17 ChrisZZ imzhuofoxmailcom Hompage https://github.com/zchrissirhcz 文章目录 1. doxygen 版本2. 找出所有的 CMakeLists.txt 和 *.cmake 文件3. cmake 构建目标清单4. 生成 Doxygen 自己的文档 1. doxygen 版本 zzLegion-R7000P% git log …

LabVIEWCompactRIO 开发指南23 Web服务

LabVIEWCompactRIO 开发指南23 Web服务 LabVIEW8.6中引入的LabVIEWWeb服务提供了一种开放的标准方式&#xff0c;可通过Web与VI进行通信。考虑一个部署在分布式系统中的LabVIEW应用程序。LabVIEW提供了网络流等功能来建立通信&#xff0c;但许多开发人员需要一种方式&#xf…

Cy7 NHS ester水溶性七甲川花菁染料标记活性脂477908-53-5

Sulfo-CY7 NHS ester是一种荧光标记试剂&#xff0c;可用于生物分子的荧光标记。它是一种水溶性的N-羟基琥珀酰亚胺酯化合物&#xff0c;具有强烈的荧光信号和高度稳定性。Sulfo-CY7 NHS ester的化学结构为C43H48N3NaO16S2&#xff0c;分子量约为968.98 g/mol。Sulfo-CY7 NHS e…

HTML5 新增的input 类型、新增的表单属性

新增的input 类型 属性值 说明 type"emall" 限制用户输入必须为Emall类型(邮箱) type"url"限制用户输入必须为URL类型(网址)type"dade"限制用户输入必须为日期类型type"time"限制用户输入必须为时间类型type"month"限…

2023年,企业数字化转型的大趋势

数字化转型&#xff08;DX&#xff09;一直是IT界的热门词汇&#xff0c;它会在组织规划中发挥更大的作用。因为完成数字化转型的组织&#xff0c;通常工作效率、生产力都会更高&#xff0c;运营成本也会降低。 一、自动化将为规范性指导提供动力 在过去十年里&#xff0c;数…

Redis数据类型-ZSet

一. 概述 SortedSet又叫zset&#xff0c;它是Redis提供的特殊数据类型&#xff0c;是一种特殊的set类型&#xff0c;继承了set不可重复的特点&#xff0c;并在set基础上为每个值添加一个分数&#xff0c;用来实现值的有序排列。 二. 常用指令 明白它的特点后&#xff0c;接下来…

OpenAI-whisper语音识别模型

1、whisper简介 Whisper是一个通用的语音识别模型。它是在不同音频的大型数据集上训练的&#xff0c;也是一个多任务模型&#xff0c;可以执行多语言语音识别、语音翻译和语言识别。 whisper有五种模型尺寸&#xff0c;提供速度和准确性的平衡&#xff0c;其中English-only模型…

使用 VS Code 快速搭建 ESP-IDF 开发环境 (Windows、Linux、MacOS)

ESP-IDF 是乐鑫官方的物联网开发框架&#xff0c;适用于 ESP32、ESP32-S、ESP32-C 和 ESP32-H 系列 SoC。它基于 C/C 语言提供了一个自给自足的 SDK&#xff0c;方便用户在这些平台上开发通用应用程序&#xff0c;并集成了大量的软件组件&#xff0c;包括 RTOS、外设驱动程序、…

Flutter 桌面开发 | 键盘快捷键功能 - Shortcuts 组件

theme: cyanosis 在桌面端的开发中&#xff0c;键盘快捷键是非常常见而必要的&#xff0c;比如 Ctrl F 搜索&#xff0c; Ctrl C 复制等。Flutter 既然可以开发桌面端应用&#xff0c;那必然要提供自定义快捷键&#xff0c;触发事件的功能支持。这就是本节要介绍的 Shortcuts…

【5.19】三、白盒测试方法—程序插桩法

目录 3.2 程序插桩法 3.2.1 目标代码插桩 3.2.2 源代码插桩 小提示&#xff1a;HeisenBugs 黑盒测试和白盒测试的异同 3.2 程序插桩法 程序插桩法是一种被广泛使用的软件测试技术&#xff0c;由J.C.Huang教授提出。简单来说&#xff0c;程序插桩就是往被测试程序中插入测…

合肥工业大学计算机组成原理课设-系统硬件综合设计

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;信息安全本科生课设-系统硬件综合设计报告 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#…

Varnish代理服务器

一.Varnish概述 1.Varnish 简介 Varnish是一款高性能且开源的反向代理服务器和HTTP加速器&#xff0c;其采用全新的软件体系机构&#xff0c;和现在的硬件体系紧密配合。与传统的squid相比&#xff0c;Varnish具有高性能、速度快、管理更加方便等优点&#xff0c;目前很多大型…

Python:如何基于滑动窗口进行气候因子间的相关系数分析?(逐像元)

目录 01 常规的相关系数简单说明 02 滑动窗口下的相关系数分析 最近处理一些气候因子的统计分析&#xff0c;遇到一些问题&#xff0c;记录一下。 01 常规的相关系数简单说明 在研究滑动窗口前&#xff0c;我们先来研究一下常规的相关系数分析&#xff0c;为了简化问题&…