OpenCV30分钟入门学习笔记(孔工码字)纯干货

本文介绍了OpenCV的基本图像处理功能,包括读取和显示图片、彩色通道的理解、图像裁剪、绘制几何形状、滤波处理、特征提取、模板匹配、边缘检测、二值化以及形态学操作。此外,还展示了如何使用Python和OpenCV处理摄像头实时画面。
摘要由CSDN通过智能技术生成

文章由来:个人学习笔记,笔记内容包括原视频代码、老师讲解和个人补充查阅

原教程视频:https://www.bilibili.com/video/BV1BT4y1Z7WS/

原视频下有老师的代码分享,视频纯干货(太干了),本人分享笔记出于个人的查阅和补充以及个人学习经历的分享

文章适用情景:适合初学OpenCV图像处理,使用和回顾具体知识时方便查阅

前期准备:安装Python和OpenCV工具包(此处省略)

准备图片:链接:https://pan.baidu.com/s/18xWQofkNMRxN5J6oPWusOg?pwd=rldg  提取码:rldg

一、读取、显示图片

import cv2

print(cv2.getVersionString())

image = cv2.imread("opencv_logo.jpg")  #使用opencv读取图片文件
print(image.shape) #打印图片的形状(高度,宽度,通道数)
#所有数字化的图片都是由像素网格构成的,所有的数字图像处理都是对像素进行数学运算

#把image读取到的数据显示在一个窗口
cv2.imshow("image",image)   #(窗口名,变量名)
cv2.waitKey()   #让窗口暂停并等待键盘输入(输入任意值后退出)

二、图形的彩色通道RGB

#图形的彩色通道RGB
import cv2

image = cv2.imread("opencv_logo.jpg")

#颜色通道顺序:BGR
cv2.imshow("blue",image[:,:,0])
cv2.imshow("green",image[:,:,1])
cv2.imshow("red",image[:,:,2])

#彩色图片灰度化
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) #可以描述图片明暗分布
cv2.imshow("gray",gray)

cv2.waitKey()

图像的彩色通道:计算机对于色彩的描述普遍使用了RGB三原色原理,任何颜色都是按RGB(红绿蓝)三种颜色按照一定比例混合而来。对于OpenCV来说,存储一张彩色图片等同意存储三张灰度图灰度范围是0到255,OpenCV对颜色的存储顺序是BGR(与常见的RGB顺序相反)当显示器需要渲染一张图片时,计算机会依次取出图像数据的三张灰度图,再把他们分别投影到显示器的LED芯片上从而渲染出彩色画面。
OpenCV提供一种彩色图像的灰度变换算法,可以把三个彩色通道的图像做平方和加权平均。
在计算机视觉领域,我们通常把处理之后的gray称为灰度图,大量的图像算法都是通过灰度图来操作的。

三、图像裁剪操作

import cv2

image = cv2.imread("opencv_logo.jpg")

crop = image[10:170,40:200]
"""
索引顺序:先横行后纵列
【第10行到170行,第40列到200列】
"""

cv2.imshow("crop",crop)
cv2.waitKey()

四、绘制直线、矩形、圆形

#绘制直线、矩形、圆形
import cv2
import numpy as np #OpenCV的图像数据实际是numpy数组数据结构

image = np.zeros([300,300,3],dtype=np.uint8)

cv2.line(image,(100,200),(250,250),(250,0,0),2)#直线
cv2.rectangle(image,(30,100),(60,150),(0,255,0),2)#矩形
cv2.circle(image,(150,100),20,(0,0,255),3)#圆形
cv2.putText(image,"hello",(100,50),0,1,(255,255,255),2,1)
#putText(图片,“文字”,(起点坐标),字体序号,缩放系数,(颜色),粗细,线条类型(实线))

cv2.imshow("image",image)
cv2.waitKey()

五、使用均值滤波器处理图片中的噪点

import cv2

image = cv2.imread("plane.jpg")

#高斯滤波器
gauss = cv2.GaussianBlur(image,(5, 5),0)
#中值滤波器
median = cv2.medianBlur(image,5)

cv2.imshow("image",image)
cv2.imshow("gauss",gauss)
cv2.imshow("median",median)

cv2.waitKey()

高斯滤波器:
    cv2.GaussianBlur( SRC,ksize,sigmaX [,DST [,sigmaY [,borderType ] ] ] )
    src –输入图像;图像可以具有任何数量的信道,其独立地处理的,但深度应CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
    dst –输出与图像大小和类型相同的图像src。
    ksize –高斯核大小。 ksize.width 并且 ksize.height 可以有所不同,
但它们都必须是正数和奇数。或者,它们可以为零,然后从计算 sigma*。
    sigmaX – X方向上的高斯核标准偏差。
    sigmaY – Y方向上的高斯核标准差;如果 sigmaY 为零,则将其设置为等于 sigmaX;
如果两个西格玛均为零,则分别根据ksize.width 和 进行计算 ksize.height(getGaussianKernel()有关详细信息,请参见 link);完全控制的结果,无论这一切的语义未来可能的修改,建议指定所有的ksize,sigmaX和sigmaY。
    borderType –像素外推方法。
中值滤波器:
      dst=cv2.medianBlur(src,ksize)
      dst是返回值,表示进行中值滤波后得到的处理结果。
      src 是需要处理的图像,即源图像。
      ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。
    需要注意,核大小必须是比1大的奇数,比如3、5、7等。
算法原理参考视频:https://www.bilibili.com/video/BV1F4411B7dW/

六、图像特征的提取

import cv2

image = cv2.imread("opencv_logo.jpg")#读取文件信息
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#将彩色图像转换为灰度图

#获取图像特征点(输入图像,最多获取特征点个数,图像角点的最小可接受参数(质量测量值乘以这个参数就是最小特征值,小于这个数的会被抛弃),特征点之间的最小距离(单位像素))
corners = cv2.goodFeaturesToTrack(gray,500,0.1,10)#跟踪检测图像中的角点
for corner in corners:#把每一个点标记出来
    x, y = corner.ravel()
    cv2.circle(image,(int(x),int(y)),3,(255,255,0),-1)#用圆形在彩图上标记出这些角点(特征点)

cv2.imshow("corners",image)
cv2.waitKey()

七、模板匹配扑克牌上的菱形

import cv2
import numpy as np #数学基础库

image = cv2.imread("poker.jpg")
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#灰度处理

template = gray[75:105,235:265] #选取样本

match = cv2.matchTemplate(gray,template,cv2.TM_CCOEFF_NORMED)
    #cv2.TM_CCOEFF_NORMED 标准相关匹配算法,
    # 把待检测图像和模板都各自标准化,再计算匹配度,防止光照等影响
locations = np.where(match >=0.9)#找出匹配系数大于0.9的点

w, h = template.shape[0:2]  #求出模板图片长和宽

#遍历每一个匹配点,在原始图像上画出矩形框
for p in zip(*locations[::-1]):
    x1,y1 = p[0],p[1]
    x2,y2 = x1 + w, y1 + h
    cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)#画矩形(参考04)

cv2.imshow("image",image)
cv2.waitKey()

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。zip(*)函数利用 * 号操作符,可以将元组解压为列表。

八、图像梯度算法与边缘检测

import cv2

gray = cv2.imread("opencv_logo.jpg",cv2.IMREAD_GRAYSCALE)

laplacian = cv2.Laplacian(gray,cv2.CV_64F)
    # Laplacian(拉普拉斯)算子是一种二阶导数算子,
    # 其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。

canny = cv2.Canny(gray,100,200)

cv2.imshow("gray",gray)
cv2.imshow("laplacian",laplacian)
cv2.imshow("canny",canny)

cv2.waitKey()

九、图像的二值化

import cv2

gray = cv2.imread("bookpage.jpg",cv2.IMREAD_GRAYSCALE)
ret,binary = cv2.threshold(gray,10,255,cv2.THRESH_BINARY)

#由于光照情况不同,文字图片处理可以把图片划分区域确定不同的阈值
binary_adaptive = cv2.adaptiveThreshold(
    gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,115,1)

#大金算法,不需要人为确定阈值
ret1,binary_otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

cv2.imshow("gray",gray)
cv2.imshow("binary",binary)
cv2.imshow("adaptive",binary_adaptive)
cv2.imshow("otsu",binary_otsu)

cv2.waitKey()

cv2.threshold(img, thresh, maxVal, cv2.xxx)
第一个参数是源图像,应该是灰度图;
第二个参数是对图像进行分类的阈值;
第三个参数是最大值,表示如果像素值大于(有时小于)阈值则要给出的值;
第四个参数决定给出不同类型的阈值。包括:
    - cv2.THRESH_BINARY
    - cv2.THRESH_BINARY_INV
    - cv2.THRESH_TRUNC
    - cv2.THRESH_TOZERO
    - cv2.THRESH_TOZERO_INV

十、形态学算法之腐蚀和膨胀

import cv2
import numpy as np

gray = cv2.imread("opencv_logo.jpg",cv2.IMREAD_GRAYSCALE)

_, binary = cv2.threshold(gray,200,255,cv2.THRESH_BINARY_INV)
kernel = np.ones((5,5),np.uint8)

erosion = cv2.erode(binary, kernel)#腐蚀函数
dilation = cv2.dilate(binary,kernel)#膨胀函数

cv2.imshow("binary",binary)
cv2.imshow("erosion",erosion)
cv2.imshow("dilation",dilation)

cv2.waitKey()

十一、调用电脑摄像头

import cv2

capture = cv2.VideoCapture(0)#调用摄像头设备0(设备管理器中摄像头的第一个)

while True: #循环读取每一帧的画面
    ret, frame = capture.read()
    cv2.imshow("camera",frame)
    key = cv2.waitKey(1)    #1为参数,单位毫秒,表示间隔时间
    if key != -1:
        break

capture.release()#释放摄像头或视频文件资源

waitKey(int delay)键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入。如果delay大于0,那么超过delayms后,如果没有按键,那么会返回-1,如果按键那么会返回键盘值,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入。

全部代码及图片:链接:https://pan.baidu.com/s/1aaAMeY_hCjnGHunCSXUH3Q?pwd=6tqx 提取码:6tqx

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值