OpenCV使用基础、技巧

news2024/11/17 17:25:50

OpenCV概述与安装

视觉概述

人类的视觉能够很轻易地从图像中识别出内容。但是,计算机视觉不会像人类视觉那样能够对图像进行感知和识别,更不会自动控制焦距和光圈,而是把图像解析为按照栅格状排列的数字。

这些按照栅格状排列的数字包含大量的噪声,噪声在图像上常表现为引起较强视觉效果的孤立像素点或像素块,使得图像模糊不清。因此,噪声是计算机视觉面临的一个难题。要想让图片变得清晰,就需要对抗噪声。

计算机视觉使用统计的方法对抗噪声,例如,计算机视觉虽然很难通过某个像素或者这个像素的相邻像素判断这个像素是否在图像主体的边缘上,但是如果对图像某一区域内的像素做统计,那么上述判断就变得简单了,即在指定区域内,图像主体的边缘应该表现为一连串独立的像素,而且这一连串像素的方向应该是一致的。

OpenCV常用模块
模块介绍
Core包函OpenCV库的基础结构以及基本操作
Improc包函基本的图像转换,包括滤波、卷积
Highgui轻量级的UI工具包
Video读写视频流的方法
Calib3d校准单个、双目以及多个相机的算法实现
Feature2d检测、描述、匹配特征点算法
Objecttect检测待定目标的算法
ML包含大量机器学习算法
Flann多维空间的聚类和搜索
GPU包含在CUDA GPU上优化实现的方法
Photo计算机摄影学的一些方法
Stitching图像拼接流程的实现
dnn深度神经网络模块
安装

安装Python这里我使用的是Anaconda

  1. 创建虚拟环境

    conda create --name 环境名称 python=3.8

  2. 进入环境

    activate 环境名称

    在这里插入图片描述

  3. 修改源

    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/

  4. 查看源如下图既可

    conda config --show channels

    在这里插入图片描述

  5. 安装需要的依赖

    pip install numpy pandas matplotlib opencv-python

  6. 查看是否安装成功

    pip list

在这里插入图片描述

  1. 测试一下是否安装成功

    准备一张图片 这里我命名为image.jpg

    import cv2
    image = cv2.imread("image.jpg")
    print(image)
    

    输出类似如下:

    在这里插入图片描述

OpenCV基础-图像数字化

读取图像:

# 获取彩色图像
image = cv2.imread("image.jpg")
方法作用
image.shape(垂直像素,水平像素,通道数)
image.size图像包含的像素个数
image.dtype数据类型

获取某一像素的RGB值:

print(image[231, 128])
# B通道
print(image[231, 128, 0])
# G通道
print(image[231, 128, 1])
# R通道
print(image[231, 128, 2])

输出:

[59 72 46]
59
72
46

即坐标[231, 128]上的像素的RGB值由[59 72 46]组成

拆分通道:

image = cv2.imread("image.jpg")
cv2.imshow("image", image)
b, g, r = cv2.split(image)
cv2.imshow("B", b) # 显示B通道图像
cv2.imshow("G", g) # 显示G通道图像
cv2.imshow("R", r) # 显示R通道图像

合并通道:

image = cv2.imread("image.jpg")
b, g, r = cv2.split(image)
rgb = cv2.merge([r, g, b]) # 按R→G→B顺序合并
cv2.imshow("RGB", rgb)

创建纯黑色的图像:

width = 800
height = 600
img = np.zeros((height, width), np.uint8)
cv2.imshow("img", img)

拼接图像:

image1 = cv2.imread("image1.jpg")
image2 = cv2.imread("image2.jpg")
# 水平拼接两个图像
img_h = np.hstack((image1, image2))
# 垂直拼接两个图像
img_v = np.vstack((image1, image2))
cv2.imshow("img_h", img_h)
cv2.imshow("img_v", img_v)

使用OpenCV绘制图形

绘制黄色的线:

# 绘制一个黑色的背景画布
canvas = np.zeros((300, 300, 3), np.uint8)
# 在画布上,绘制一条起点坐标为(150, 50)、终点坐标为(150, 250),黄色的,线条宽度为20的线段
canvas = cv2.line(canvas, (150, 50), (150, 250), (0, 255, 255), 20)

在这里插入图片描述

绘制矩形:

# 在画布上绘制一个左上角坐标为(65,65),右下角坐标为(180,150),青色的,线条宽度为20的矩形边框
canvas = cv2.rectangle(canvas, (65, 65), (200, 150), (255, 255, 0), 20)

在这里插入图片描述

绘制圆形:

# 在画布上,绘制一个圆心坐标为(150, 50),半径为40,黄色的实心圆形
canvas = cv2.circle(canvas, (150, 50), 40, (0, 255, 255), -1)

在这里插入图片描述

绘制多边形:

# 根据坐标[100, 50], [200, 50], [250, 250], [50, 250],绘制一个闭合的,红色的,线条宽度为5的等腰梯形边框
canvas = cv2.polylines(canvas, [np.array([[100, 50], [200, 50], [250, 250], [50, 250]], np.int32)], True, (0, 0, 255), 5)

在这里插入图片描述

绘制文字:

# 字体大小为2,线条颜色是绿色,线条宽度为5
cv2.putText(canvas, "Hello World", (20, 70), cv2.FONT_HERSHEY_TRIPLEX, 2, (0, 255, 0), 5)

在这里插入图片描述

OpenCV图像变换

图像缩放:

img = cv2.imread("image.png")
# 宽100像素、高100像素的大小进行缩放
dst = cv2.resize(img, (100, 100))

按比例缩放:

# 将宽缩小到原来的1/3、高缩小到原来的1/2
dst = cv2.resize(img, None, fx=1 / 3, fy=1 / 2)
# 将宽高扩大2倍
dst = cv2.resize(img, None, fx=2, fy=2)

图像翻转:

沿X轴翻转:

dst1 = cv2.flip(img, 0)

沿Y轴翻转:

dst2 = cv2.flip(img, 1) 

同时沿X轴、Y轴翻转:

dst3 = cv2.flip(img, -1)

图像旋转:

# 图像像素行数
rows = len(img)
# 图像像素列数
cols = len(img[0])
# 图像的中心点
center = (rows / 2, cols / 2)
# 以图像为中心,逆时针旋转30度,缩放0.8倍
M = cv2.getRotationMatrix2D(center, 30, 0.8)
dst = cv2.warpAffine(img, M, (cols, rows))

OpenCv图形检测

绘制图像轮廓:

img = cv2.imread("image.png")
# 彩色图像转为变成单通道灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 灰度图像转为二值图像
t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 检测图像中出现的所有轮廓,记录轮廓的每一个点
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
# 绘制所有轮廓,宽度为5,颜色为红色
cv2.drawContours(img, contours, -1, (0, 0, 255), 5)

为轮廓添加矩形框:

# 获取第一个轮廓的最小矩形边框,记录坐标和宽高
x, y, w, h = cv2.boundingRect(contours[0])
# 绘制红色矩形
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)

为轮廓添加圆形框:

contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
# 获取最小圆形边框的圆心点和半径
center, radius = cv2.minEnclosingCircle(contours[0])
# 圆心点横坐标转为近似整数
x = int(round(center[0]))
# 圆心点纵坐标转为近似整数
y = int(round(center[1]))
cv2.circle(img, (x, y), int(radius), (0, 0, 255), 2)

Canny边缘检测:

img = cv2.imread("image.png")
r1 = cv2.Canny(img, 10, 50)

直线检测:

img = cv2.imread("image.jpg")
# 复制原图
o = img.copy()
# 使用中值滤波进行降噪
o = cv2.medianBlur(o, 5)
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)
binary = cv2.Canny(o, 50, 150)  # 绘制边缘图像
# 检测直线,精度为1,全角度,阈值为15,线段最短100,最小间隔为18
lines = cv2.HoughLinesP(binary, 1, np.pi / 180, 15, minLineLength=100, maxLineGap=18)
for line in lines:  # 遍历所有直线
    x1, y1, x2, y2 = line[0]  # 读取直线两个端点的坐标
    cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)  # 在原始图像上绘制直线

圆环检测:

img = cv2.imread("image.jpg")
o = img.copy()
o = cv2.medianBlur(o, 5)
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)  # 从彩色图像变成单通道灰度图像
# 检测圆环,圆心最小间距为70,Canny最大阈值为100,投票数超过25。最小半径为10,最大半径为50
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 70, param1=100, param2=25, minRadius=10, maxRadius=50)
circles = np.uint(np.around(circles))  # 将数组元素四舍五入成整数
for c in circles[0]:  # 遍历圆环结果
    x, y, r = c  # 圆心横坐标、纵坐标和圆半径
    # 绘制圆环
    cv2.circle(img, (x, y), r, (0, 0, 255), 3)
    # 绘制圆心
    cv2.circle(img, (x, y), 2, (0, 0, 255), 3)

OpenCV处理视频

开启摄像头:

import cv2
# 打开笔记本内置摄像头
capture = cv2.VideoCapture(0)
while (capture.isOpened()):
    # 从摄像头中实时读取视频
    retval, image = capture.read()
    # 在窗口中显示读取到的视频
    cv2.imshow("Video", image)
    # 窗口的图像刷新时间为1毫秒
    key = cv2.waitKey(1)
    # 按下空格就终止
    if key == 32:
        break
capture.release()
cv2.destroyAllWindows()

彩色视频转换为灰度视频:

import cv2
capture = cv2.VideoCapture(0, cv2.CAP_DSHOW)
while (capture.isOpened()):
    retval, image = capture.read()
    # 把彩色视频转换为灰度视频
    image_Gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    if retval == True: 
        cv2.imshow("Video", image)
        cv2.imshow("Video_Gray", image_Gray) 
    key = cv2.waitKey(1)
    if key == 32: 
        break
capture.release() 
cv2.destroyAllWindows()

保存视频图像:

import cv2
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
while (cap.isOpened()):
    ret, frame = cap.read()
    cv2.imshow("Video", frame) 
    k = cv2.waitKey(1)
    if k == 32:
        cap.release() 
        cv2.destroyWindow("Video")
        cv2.imwrite("路径", frame) # 保存按下空格键时摄像头视频中的图像
        cv2.waitKey() # 刷新图像
        break
cv2.destroyAllWindows() # 销毁显示图像的窗口

播放视频文件:

import cv2
video = cv2.VideoCapture("视频路径")
while (video.isOpened()):
    retval, image = video.read()
    # 设置“Video”窗口的宽为800,高为600
    cv2.namedWindow("Video", 0)
    cv2.resizeWindow("Video", 800, 600)
    if retval == True:
        # 在窗口中显示读取到的视频文件
        cv2.imshow("Video", image)
    else:
        break
    key = cv2.waitKey(1)
    # 按下ESC退出
    if key == 27: 
        break
video.release()
cv2.destroyAllWindows()

视频文件转换为灰度的:

import cv2
video = cv2.VideoCapture("视频路径")
while (video.isOpened()): 
    retval, img_Color = video.read()
    cv2.namedWindow("Gray", 0)
    cv2.resizeWindow("Gray", 800, 600)
    if retval == True: 
        img_Gray = cv2.cvtColor(img_Color, cv2.COLOR_BGR2GRAY)
        cv2.imshow("Gray", img_Gray)
    else: 
        break
    key = cv2.waitKey(1) 
    if key == 27: 
        break
video.release()
cv2.destroyAllWindows()

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

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

相关文章

Java中Integer(127)==Integer(127)为True,Integer(128)==Integer(128)却为False,这是为什么?

文章目录 1.前言2. 源码解析3.总结 1.前言 相信大家职业生涯中或多或少的碰到过Java比较变态的笔试题,下面这道题目大家应该不陌生: Integer i 127; Integer j 127;Integer m 128; Integer n 128;System.out.println(i j); // 输出为 true System.o…

华为数通方向HCIP-DataCom H12-831题库(判断题:121-140)

第121题 BGP/MPLS IP VPN内层采用MP-BGP分配的标签区分不同的VPN实例,外层可采用多种隧道类型,例如GRE隧道。 正确 错误 答案: 错误 解析: VPN业务的转发需要隧道来承载,隧道类型包括GRE隧道、LSP隧道、TE隧道(即CR-LSP)。 如果网络边缘的PE设备具备MPLS功能,但骨干网核…

Deepin基本环境查看(四)【硬盘/分区、文件系统、硬连接/软连接】

Linux操作系统(Deepin、Ubuntu)操作系统中,硬盘分区的管理与Windows操作系统不同; 在Linux系统中维护着一个统一的文件目录体系,而硬盘和分区是以资源的形式由操作系统挂接和调度;此外Linux系统中连接(硬连…

UE创建数据表格

创建一个数据表格需要行结构 继承自FTableRowBase的一个子类 效果 如何使用它 在蓝图中给C该类型的指针变量选用 UDataTable类型的 FindRow()函数可查询并返回对应行的行结构 FTableRowBase GetAllRows()函数可以获得该数据表的所有行、

全面解析开源大语言模型:BLOOM

大型语言模型 (LLM) 的兴起一直是自然语言处理 (NLP) 领域的一个决定性趋势,导致它们在各种应用程序中的广泛采用。然而,这种进步往往是排他性的,大多数由资源丰富的组织开发的 LLM 仍然无法向公…

手动搭建koa+ts项目框架(apidoc文档篇)

文章目录 一、安装apidoc工具二、使用1、项目根目录新建apidoc.json2、定义接口路由上方注解对应信息3、配置静态文件访问目录4、生成api文档如有启发,可点赞收藏哟~ 一、安装apidoc工具 全局安装 npm i apidoc -g查看是否安装成功 apidoc -v二、使用 1、项目根…

面向社交网络语言隐写分析

论文:Linguistic Steganalysis Toward Social Network 发表在:IEEE Transactions on Information Forensics & Security是网络与信息安全领域的国际两大顶级期刊之一,中国计算机学会(CCF)推荐的A类期刊&#xff0c…

第一篇【传奇开心果短博文系列】鸿蒙开发技术点案例示例:从helloworld开始理解鸿蒙开发ArkTS编程思路

传奇开心果短博文系列 系列短博文目录鸿蒙开发技术点案例示例系列 短博文目录一、前言二、初步解读鸿蒙的helloworld三、进一步深入解读理解 系列短博文目录 鸿蒙开发技术点案例示例系列 短博文目录 一、前言 从掰碎了揉烂了详细注释解读helloworld开始,理解Ark…

matlab appdesigner系列-容器2-选项卡组

所谓容器,就是可以放置常有组件的空间,类似一种画布。默认背景画布就是一张画布,选项卡组,可以同时增加好几个画布空间,以满足不的组件放置需求。 1)将选项卡组拖拽到画布上 2)将选项卡组拉大背…

linux-centos服务器离线安装yapi(包含nodejs、mongodb、yapi、pm2离线安装)

yapi是使用vue框架开发的,借助nodejs 前端直接访问的mongodb数据库,离线安装yapi步骤如下 下载离线安装包 下载地址 https://download.csdn.net/download/qq445829096/88778418 离线安装包先复制到 dev/yapi目录(根据自己习惯自定义目录) node-v12.13.0-linux-x64.tar.xz …

10.多柱状图(MuliBarChart)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7、MAUI 话接上回&#xff08;9.单柱状图&#xff08;SingleBarChart&#xff09;&#xff09;&#xff0c;从单柱拓展到多柱状图。 1.数据设置 private void InitValue(List<BasicSerieDto> dtos){Serie…

EXCEL VBA调用adobe的api识别电子PDF发票里内容并登记台账

EXCEL VBA调用adobe的api识别电子PDF发票里内容并登记台账 代码如下 使用须知&#xff1a; 1、工具--引用里勾选[Adobe Acrobat 10.0 Type Library] 2、安装Adobe Acrobat pro软件Dim sht As Worksheet Function BrowseFolders() As String 浏览目录Dim objshell As ObjectDim…

ORM-08-EclipseLink 入门介绍

拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.&#xff08;手写简易版 mybatis&#xff09; 1. EclipseLink概述 本章介绍了EclipseLink及其关键特性&#xff1a;包括在EclipseLink中的组件、元数据、应用程序架构、映射和API。 本…

202|读书笔记《金融的本质:伯南克四讲美联储》

今天跟朋友聊天&#x1f4ac;&#xff0c;说已经没人看书了&#x1f4d6; 我想&#xff0c; 还是会有人读书的吧。 ​ 一、美联储的起源和使命 1. 第一讲&#xff1a;美国南北战争结束后的40年间&#xff0c;美国经历了6次大的银行体系恐慌&#xff0c;促使其于1913年成立美联储…

如何在Word中选择多个图片?这里提供两个方法及详细步骤

你的Word文档中可能有一些图片。要更改图片的几个参数,可以逐个编辑它们。当你有更多的图片时,你可能需要一次选择所有图片。这允许你一次更改所有内容。默认情况下,Word不允许你一次选择多张图片。 Word插入图片的两个布局选项 文字环绕 嵌入文本中 默认情况下,Word会在文…

注册表学习——注册表结构

简介&#xff1a;注册表是由很多项和值构成的。 HEKY_USERS&#xff08;HKU&#xff09; 主要保存默认用户及当前登录用户配置信息。 .DEFAULT 该项是针对未来创建的新用户所保存的默认配置项。 S-1-5-18等项 这些项叫作安全标识符&#xff08;SID&#xff09;用来表示Windows操…

初识C语言·自定义类型(2)

目录 1 结构体的声明和定义 2 结构体的自引用 3 结构体成员访问操作符 4 内存对齐 4 结构体传参 5 位段 1 结构体的声明和定义 什么是结构&#xff1f;结构也就是元素的集合&#xff0c;在C语言里面&#xff0c;结构体里面的可以有多个变量&#xff0c;类似于集合中的元素…

下载并安装nacos 2.3 for arm64

客户组织安全测试&#xff0c;我们系统测出了好几个高危问题&#xff0c;其中大部分是关于nacos的。 原先的nacos版本太低了&#xff0c;是1.3的。现在&#xff08;2024.01&#xff09;已经是2.3了&#xff0c;应该装个新的。我们使用docker安装nacos&#xff0c;原本很简单的…

程序员必备的20个学习网站

今天好学编程小编整理了20个程序员必备的学习网站&#xff0c;此篇对于新手程序员比较有用&#xff0c;技术老鸟们也可以查缺补漏。话不多说&#xff0c;纯纯干货呈上&#xff0c;赶紧点个赞收藏&#xff0c;以后会用得上&#xff01; 技术网站类 1、博客园 一个面向开发者的…

基于SSM的蛋糕甜品店管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的蛋糕甜品店管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…