OpenCV使用基础、技巧

这篇具有很好参考价值的文章主要介绍了OpenCV使用基础、技巧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 环境名称

    OpenCV使用基础、技巧,opencv,人工智能,计算机视觉,python

  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

    OpenCV使用基础、技巧,opencv,人工智能,计算机视觉,python

  5. 安装需要的依赖

    pip install numpy pandas matplotlib opencv-python

  6. 查看是否安装成功

    pip list

OpenCV使用基础、技巧,opencv,人工智能,计算机视觉,python

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

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

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

    输出类似如下:

    OpenCV使用基础、技巧,opencv,人工智能,计算机视觉,python

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)

OpenCV使用基础、技巧,opencv,人工智能,计算机视觉,python

绘制矩形:

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

OpenCV使用基础、技巧,opencv,人工智能,计算机视觉,python

绘制圆形:

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

OpenCV使用基础、技巧,opencv,人工智能,计算机视觉,python

绘制多边形:

# 根据坐标[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)

OpenCV使用基础、技巧,opencv,人工智能,计算机视觉,python

绘制文字:

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

OpenCV使用基础、技巧,opencv,人工智能,计算机视觉,python

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()

视频文件转换为灰度的:文章来源地址https://www.toymoban.com/news/detail-836442.html

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()

到了这里,关于OpenCV使用基础、技巧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【人工智能的数学基础】使用Mitchell近似构造加法神经网络

    使用Mitchell近似构造加法神经网络. paper:Deep Neural Network Training without Multiplications arXiv:link 本文通过 Mitchell 近似算法将乘法运算转变为加法运算,从而降低了神经网络中的乘法的运算量。 Mitchell 近似是一种在二进制下近似的 快速对数 和 指数 计算方法。对于一个十进制的非

    2024年02月07日
    浏览(78)
  • 玩转AIGC(人工智能生成内容)需要一些小技巧

    玩转AIGC(人工智能生成内容)的确需要一些技巧,而Prompt提示词的选择非常关键,可以影响到生成的答案。以下是一些与AI对话的技巧和咒语示例: 确保你的Prompt清晰明了,包括主题、问题或指令,以便AI能够更好地理解你的需求。 有点像小学语文,老师会要求你用一句话描

    2024年02月05日
    浏览(91)
  • 人工智能基础_机器学习015_BGD批量梯度下降代码演示_在批量梯度下降中使用逆时衰减---人工智能工作笔记0055

    然后我们用代码来演示一下BGD批量梯度下降,首先启动jupyter notebook 然后我们新建一个文件 新建文件夹,然后新建一个python文件 然后我们这里用一元一次方程进行批量梯度下降. import numpy as np 导入数学计算包 X = np.random.rand(100,1)  `np.random.rand(100, 1)` 是NumPy库中的一个函数,用于

    2024年02月05日
    浏览(65)
  • 人工智能基础部分24-人工智能的数学基础,汇集了人工智能数学知识最全面的概况

    、 大家好,我是微学AI,今天给大家介绍一下人工智能基础部分24-人工智能的数学基础,汇集了人工智能数学知识最全面的概况,深度学习是一种利用多层神经网络对数据进行特征学习和表示学习的机器学习方法。要全面了解深度学习的数学基础,需要掌握这些数学知识:向

    2024年02月21日
    浏览(75)
  • 人工智能基础_机器学习003_有监督机器学习_sklearn中线性方程和正规方程的计算_使用sklearn解算八元一次方程---人工智能工作笔记0042

    然后我们再来看看,如何使用sklearn,来进行正规方程的运算,当然这里 首先要安装sklearn,这里如何安装sklearn就不说了,自己查一下 首先我们还是来计算前面的八元一次方程的解,但是这次我们不用np.linalg.solve这个 解线性方程的方式,也不用 直接 解正规方程的方式: 也就是上面这种

    2024年02月08日
    浏览(55)
  • 【实用技巧】掌握人工智能语音转换的核心技术,轻松实现多语言语音转换和语音合成

    作者:禅与计算机程序设计艺术 【实用技巧】掌握人工智能语音转换的核心技术,轻松实现多语言语音转换和语音合成 1.1. 背景介绍 随着全球化的加速,跨文化交流需求日益增长,多语言语音转换和语音合成技术应运而生。人工智能技术的发展为语音合成和转换提供了便利

    2024年02月08日
    浏览(109)
  • 【人工智能】AGI 通用人工智能基础概念、实现原理、挑战和发展前景

    Artificial intelligence prompt completion by dalle mini, https://github.com/borisdayma/dalle-mini 随着计算机技术、机器学习和神经网络等技术的发展,人工智能(Artificial Intelligence, AI)已经成为当今计算机科学和工程领域的热门话题之一。 强人工智能(Strong AI)或通用人工智能(英语:Artificia

    2024年02月09日
    浏览(62)
  • 人工智能基础篇

    本篇目录: 一、人工智能、机器学习、深度学习的关系 (1)、关系图 (2)、人工智能 (3)、人类智能过程 (4)、机器学习 (5)、深度学习 二、人工智能研究的领域 三、人工智能的应用场景 (1)、计算机视觉 (2)、语音技术 (3)、自然语言处理 (4)、决策系统

    2024年02月09日
    浏览(87)
  • 学习人工智能-基础篇

    背景 随着大模型的火爆,人工智能再次被推到高潮,其实它在众多行业领域已经落地很多应用,并给社会带来了巨大的经济价值。其中包括互联网、教育、金融、医疗、交通、物流等等。在测试领域也有一些落地的案例,作为测试人员,有必要去了解并学习人工智能,去挖掘

    2024年02月04日
    浏览(40)
  • 人工智能基础学习

    人类的一大优势是没有一种智能。 有些人可以轻松学习新语言,而另一些人则精通科学和技术。 然而,许多伟大的艺术家都是糟糕的数学家。 另一方面,许多伟大的数学家都是糟糕的艺术家。 但每个人都可以以自己的方式变得聪明。 人类智能没有一个标准。 这使得你很难

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包