opencv必会基础知识

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

核心知识

(1)色彩空间变换

(2)像素访问

(3)矩阵的 + -  * /

(4)基本图形的绘制

以上的核心知识将会在接下来的部分给大家介绍清楚,并且有实战代码展示。

色彩空间

色彩空间基础知识

(1)RGB:是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色。(简单来说就是人对于颜色的一个识别,当然机器也是这样的)

(2)BGR:Opencv默认使用BGR。

其实对于rgb和bgr来说,就是红绿蓝的排列顺序不同,所以在编写代码时,需要注意顺序问题。

(3)HSV/HSB/HSL: Opencv最常用的就是HSV。H代表色相,S代表饱和度,V/B代表明亮度,HSV与HSB其实是一样的,只是在翻译时不同。

(4)YUV:主要用于视频领域。

RGB和BGR

opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

RGB:每一个方框都代表一个像素 ,每一个像素都是由RGB显示出来的。

opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

BGR:同样与RGB类似,每一个方框都代表一个像素 ,每一个像素都是由BGR显示出来的。

HSV与HSL

HSV相关知识

Hue:色相,即颜色,如红色,蓝色

Saturation:饱和度,颜色的纯度(越大越纯)

Value:明度(越明一点就代表黑色的部分少一点)

opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

 对于第一张图,Hue是圆的一周,也就是在不同角度下颜色在发生变化。Saturation是从圆的平面看,从里到外值越来越高,颜色就越来越纯(颜色中灰色的部分越来越少)。Value是从圆柱的高进行观察,从下到上,Value值越来越高,也就越来越亮(黑色的部分越来越少)。

为什么我们使用HSV?

因为相对于RGB来说,HSV的参数更多,我们可以使用HSV来判断色相,饱和度,亮度等等信息。使图片描绘更加准确。

HSL相关知识

Hue:色相,即颜色,如红色,蓝色

Saturation:饱和度,颜色的纯度(越大越纯)

ligthness:明度(越明一点就代表黑色的部分少一点)

opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

左边的使HSL,我们可以发现Hue和Saturation都是相同的,并且高都是亮度,但是HSL从下到上出现最上面的颜色都是白色的现象,这个就是HSL。

相较于我们目前使用的HSV更加重要一点。

YUV

主要用于视频中。

(1)YUV4:2:0

(2)YUV4:2:2

(3)YUV4:4:4

Y代表灰色的图像,UV代表的是颜色 。YUV4:4:4其实就和RGB是一样的,RGB是8:8:8

opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

YUV4:2:0就是四个像素中有4个Y但是后面的2可能是U可能是V

色彩空间转换实战代码

import cv2

def callback1(i):
    pass

cv2.namedWindow('color', cv2.WINDOW_AUTOSIZE)

img = cv2.imread('E:\\pycharm\\PycharmFile\\opencv\\MM\\preview.jpg')

colorspaces = [cv2.COLOR_BGR2RGBA, cv2.COLOR_BGR2BGRA,
               cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV,
               cv2.COLOR_BGR2YUV]

cv2.createTrackbar('curcolor', 'color', 0, 4, callback1)

while True:
    index = cv2.getTrackbarPos('curcolor', 'color')
    # print("11111")
    # 色彩转化api
    cvt_img = cv2.cvtColor(img, colorspaces[index])

    cv2.imshow('color', cvt_img)
    key = cv2.waitKey(10)
    if (key & 0xFF == ord('q')):
        break

cv2.destroyAllWindows()

结果显示如下: 

opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

通过拖动TrackBar改变颜色显示,例如index为0的时候  cv2.COLOR_BGR2RGBA就是将原来的BGR图片转化为RGB。 其他情况和这种类似。

Numpy库

图像的加减乘除都与这个函数密切相关

Numpy库的相关知识 

(1)Opencv中使用到的矩阵都需要转化为Numpy数组

(2)Numpy是一个高度优化的Python数值库

Numpy基本操作

(1)创建矩阵:大家都知道图形的处理其实就是矩阵的处理。说的简单点,就一个宽多少高多少的一个矩阵,每个矩阵值就是一个像素点,那你只要改变其中的值,它这个颜色就发生变化。在它周围做一些处理的话,就会形成一个形状,如果把矩阵中的所有的位置都经过特殊处理的话,那它就成了一幅图片。如果把这些图片再连在一起播放的话,它就成了视频,这个就是一个基本的原理。

(2)检索与赋值:我们要能够知道如何获取矩阵中某个元素的值。并且改变这个元素的值。

(3)获取子数组:要获取大的矩阵中的某一小块儿矩阵,或者是给这一小块矩阵赋值。

创建矩阵API:创建数组array(),创建全0或者全1的数组 zeros()/ones(),创建一个全值的数组 full()矩阵中所有的值都是指定的值,创建单位矩阵identity/eye()

检索矩阵API:[y,x] 下标是y和x,索引值是从0开始的。[y,x,channel] channel通道数,也可以认为是层数。

获取子矩阵API:[y1:y2,x1:x2] y1到y2范围和x1到x2范围。[:,:] 对整个矩阵进行操作

Numpy实战代码

创建矩阵

array:a=array([2,3,4])这样得到的就是一个一维的数组 

            b=array([[2,3,4],[1,2,3]])这样得到了一个2x3的矩阵

import numpy as np
import cv2

# 通过array建立矩阵
a = np.array([1, 2, 3])
b = np.array([[1, 2, 3], [1, 2, 3]])
print(a)
print(b)

打印出的结果:opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

c=np.zeros((480,640,3),np.uint8) 打印出的是640x480

(480,640,3)(行的个数,列的个数,通道数/层数)

np.uint8 矩阵中的数据类型

# 定义zeros矩阵
c = np.zeros((8, 8, 3), np.uint8)  # ((行的个数(高),列的个数(宽),层数),np.uint8代表的是八位元素,最大值为255)
print(c)

d=np.ones((480,640,3),np.uint8) 打印出的是640x480

(480,640,3)(行的个数,列的个数,通道数/层数)

np.uint8 矩阵中的数据类型

# 定义ones矩阵
d = np.ones((8, 8), np.uint8)
print(d)

e=np.full((480,640,3),255,np.uint8)  其中255就是我们向矩阵中添加的值

(480,640,3)(行的个数,列的个数,通道数/层数)

np.uint8 矩阵中的数据类型

# 定义full矩阵
e = np.full((8, 8), 255, np.uint8)
print(e)

 f=np.identity(3)

斜对角都是1,其余都是0 。括号中的3代表3x3的矩阵。

# 定义单位矩阵indentity
f = np.identity(4)  # 4x4的单位矩阵
print(f)

打印出的结果:opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉 

g= np.eye((3,5),k=3) 与单位矩阵类似,但是可以说是长方形的

# 定义eye
g = np.eye(4)  # 退化成identity矩阵了 4x4
h = np.eye(4, 5, k=2)  # 4x5 第一个1是从第3列开始往下斜
print(g)
print(h)

打印出的结果 :opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

检索矩阵 

在创建的矩阵中检索出某个值

img = np.zeros((480, 640, 3), np.uint8)  # 在(480,480)时,打印的就是一个0 (480,480,3),打印是三个0
# 从矩阵中读某个元素的值
print(img[100, 100])

也可以对这个检索到的值进行修改,如果修改的是一个范围上的值,就可以清晰看出图像出现变化,由于我们创建的是一个480x640的全0的图,为黑色。对部分范围值进行修改,图片出现变化。

count = 0
# 向矩阵中某个元素赋值
while count < 300:
    # BGR
    img[count, 100, 0] = 255  # 如果三次情况下[count,100]就是三层都变 [count,100,0]第一层变 按照bgr色彩变化
    # img[count,100]=[255,0,0]   #和上面赋值结果相同
    count = count + 1

 运行结果就是在黑色背景下,第一层颜色变化,第一层是蓝色,所以出现下面的图像。

opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

获取子矩阵 

roi = img[100:400, 100:600]
roi[:, :] = [0, 0, 255]  # [:,:] 代表全部变化
# roi[:]=[0,0,255] 和上面的一样 代表全部
roi[10:200, 10:300] = [0, 255, 0]
roi[200:280, 300:480] = [255, 0, 0]

cv2.imshow('roi', roi)

 首先我们在原来的图片中取[100:400, 100:600]这个范围变成我们的子矩阵,接着对子矩阵进行全面的赋值,变成红色,随后在子矩阵中选择两个区域变换颜色,结果如下图。

opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

最重要的结构体Mat

Mat的相关知识

Mat是什么?

从应用的角度,实际上Mat就是一个矩阵。矩阵可能含有多个通道,如果是一个通道的话,它就是灰色的,只有黑白两种颜色,就是一个二维矩阵。如果是全真色的,它就是一个三个通道的,矩阵包括了这个bgr 3种颜色,通过这种三种颜色可以组合中任何的颜色。

Mat有什么好处?

可以通过Numpy直接通过矩阵的形式对他进行访问。操作方便。

Mat的组成

opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

 Mat由header和data组成,data中包含的就是存放图像的具体数值。

opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

header包括一些属性,属性包括:维数,行列数,存储数据的指针,引用数据(也就是说。每一次就同一张图片,通过不同的变量去引用它的时候呢,实际它修改的都是同一块数据。) 

Mat的拷贝

opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

从图中了解,我们对MatA进行拷贝为MatB,此时我们的数据其实没有进行拷贝的,只是将header部分进行拷贝,当我想调用data中的数据时,可以使用MatB的header指向data得到想要的数据,此种拷贝方式为浅拷贝(默认拷贝就是浅拷贝)

浅拷贝

Mat A

A=imread(file,IMREAD_COLOR)

Mat B(A)

这样就完成了对A的浅拷贝

深拷贝

cv::Mat:;clone()

cv::Mat::copyTo()

这样就完成了对A的深拷贝

在python中的方法就是 copy()

Mat拷贝实战代码

import cv2
import numpy as np

img = cv2.imread('E:\\pycharm\\PycharmFile\\opencv\\MM\\preview.jpg')

# 浅拷贝
img2 = img

# 深拷贝
img3 = img.copy()

# 对图像进行修改
img[0:100, 0:100] = [0, 0, 255]

cv2.imshow('img', img)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)

cv2.waitKey()

我们写完代码后思考,img我时拿到了一个图片,通过img对img2进行浅拷贝,那我如果对img图片进行修改的话,img2也会一起发生改变。而img3是深拷贝,应该不会发生变化。接下来观察结果。 

opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉 opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

我们可以发现,如我们想的那样,img2和img发生了同样的变化,而img3没有发生变化。

访问图像(Mat)的属性实战代码

访问图像的属性在python直接使用shape就可以得到结果了。shape属性中包括了高度,宽度,通道数三个属性,size属性可以知道图像占用的空间大小,dtype属性可以知道每个元素的位深。

import cv2
import numpy as np

img = cv2.imread('E:\\pycharm\\PycharmFile\\opencv\\MM\\preview.jpg')

# shape 属性中包括了 高度 宽度 通道数 三个属性
# 高度 宽度 通道数
print(img.shape)

# 图像占用多大空间
# 高度*宽度*通道数
print(img.size)

# 图像中每个元素的位深
print(img.dtype)  # uint8

图像通道分离与合并

图像通道分离与合并API

分离:spit(mat)

 合并:merge((ch1,ch2,……))

图像通道分离与合并实战代码

import cv2
import numpy as np

img = np.zeros((480, 460, 3), np.uint8)

b, g, r = cv2.split(img)

b[10:100, 10:100] = 255
g[60:150, 60:150] = 255

img2 = cv2.merge((b, g, r))

cv2.imshow('img', img)
cv2.imshow('b', b)
cv2.imshow('g', g)
cv2.imshow('img2', img2)

cv2.waitKey(0)

从代码中可以思考,自己先创建了一个黑色的480x460的图片,通过split对其进行分离成3个图,分别对其中两个图的部分进行修改,变化的部分变成了白色。最后又将三张图合并在一起,分别变化的部分依旧保留。结果如下显示。 

opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉opencv必会基础知识,opencv(python)(内含实战项目),opencv,人工智能,计算机视觉

我们发现,合并完后原先变化的部分是白色255,但是现在变成了蓝色和绿色,并且相交的部分颜色变成青色,这个是因为本身我们设置图片是三层的BGR,分别开处理时每一层就是一个单通道的0-255,但是合在一起又恢复成三通道了,颜色也就显现出来了。文章来源地址https://www.toymoban.com/news/detail-775906.html

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

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

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

相关文章

  • OpenCV基础知识(8)— 图形检测

    前言: Hello大家好,我是小哥谈。 图形检测是计算机视觉的一项重要功能。通过图形检测可以分析图像中可能存在的形状,然后对这些形状进行描绘,例如搜索并绘制图像的边缘,定位图像的位置,判断图像中有没有直线、有没有圆形等。虽然图形检测涉及非常深奥的数学算

    2024年02月11日
    浏览(62)
  • 【opencv】计算机视觉基础知识

    目录 前言 1、什么是计算机视觉 2、图片处理基础操作 2.1 图片处理:读入图像 2.2 图片处理:显示图像 2.3 图片处理:图像保存 3、图像处理入门基础 3.1 图像成像原理介绍 3.2 图像分类 3.2.1 二值图像 3.2.2灰度图像 3.2.3彩色图像(RGB) 4、像素处理操作 4.1 读取像素 4.2 修改像素

    2024年02月04日
    浏览(66)
  • 【OpenCV】计算机视觉图像处理基础知识

    目录 前言 推荐 1、OpenCV礼帽操作和黑帽操作 2、Sobel算子理论基础及实际操作 3、Scharr算子简介及相关操作 4、Sobel算子和Scharr算子的比较 5、laplacian算子简介及相关操作 6、Canny边缘检测的原理 6.1 去噪 6.2 梯度运算 6.3 非极大值抑制 6.4 滞后阈值 7、Canny边缘检测的函数及使用

    2024年02月05日
    浏览(58)
  • MySQL实战基础知识入门(13):数据类型

    MySQL实战基础知识入门(1):登录数据库命令行 MySQL实战基础知识入门(2):统计一天24小时数据默认补0的sql语句 MySQL实战基础知识入门(3):近7日销量合计php后端mysql语句如果当日为空则自动补0的解决方案 MySQL实战基础知识入门(4):MySQL高级函数CASE WHEN END MySQL实战基础知识入门

    2024年02月07日
    浏览(68)
  • 【Datawhale组队学习:Sora原理与技术实战】AIGC技术基础知识

    AIGC全称叫做AI generated content,AlGC (Al-Generated Content,人工智能生产内容),是利用AlI自动生产内容的生产方式。 在传统的内容创作领域中,PGC(Professionally-generated Content,专业生成内容)和UGC(User-generated Content,用户内容生产)作为两大主流模式,共同构成了内容生产的核心来

    2024年04月26日
    浏览(37)
  • 【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)

    ​本篇文章几乎涵盖了绝大部分的Shell语法练习,用一个个实战练习,巩固Shell的学习,话不多说,直接开始。 练习1:按照时间生成文件\\\"2018-05-22.log\\\"将每天的磁盘使用状态写入到对应日期的文件 练习2:统计Nginx日志中每个IP的访问量有多少,日志格式如下 练习3:写一个脚本

    2024年02月14日
    浏览(62)
  • OpenCV基础知识(9)— 视频处理(读取并显示摄像头视频、播放视频文件、保存视频文件等)

    前言: Hello大家好,我是小哥谈。 OpenCV不仅能够处理图像,还能够处理视频。视频是由大量的图像构成的,这些图像是以固定的时间间隔从视频中获取的。这样,就能够使用图像处理的方法对这些图像进行处理,进而达到处理视频的目的。要想处理视频,需要先对视频进行读

    2024年02月11日
    浏览(57)
  • Android webrtc实战(一)录制本地视频并播放,附带详细的基础知识讲解

    目录 一、创建PeerConnectionFactory 初始化 构建对象 二、创建AudioDeviceModule AudioDeviceModule JavaAudioDeviceModule 构建对象 setAudioAttributes setAudioFormat setAudioSource 创建录制视频相关对象 创建VideoSource 创建VideoCapturer 创建VideoTrack 播放视频 切换前后置摄像头 别忘了申请权限 完整代码 本系列

    2024年02月16日
    浏览(56)
  • Python基础知识:整理10 异常相关知识

        当在主函数中没有捕获处理异常时,会报异常错误 处理后   

    2024年01月18日
    浏览(61)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包