光速入门python的OpenCV

news2024/12/26 23:34:32

前言

欢迎来到我的博客

个人主页:北岭敲键盘的荒漠猫-CSDN博客

 本文整理python的OpenCV模块的关键知识点

争取用最短的时间入门OpenCV

并且做到笔记功能直接复制使用

OpenCV简介

不浪费时间的介绍:

就是类似于ps操作图片。

至于为什么不直接用ps,因为只有程序能完成ps的操作,这样才能完全自动化2小时不间断的执行一些程序,总不能执行到一定地方要等你人为的在ps中做好图片再来执行程序吧。

功能点罗列:

画图,图片高斯模糊,腐蚀膨胀等处理,开启摄像头。

最基本的使用

导入模块:import cv2
方法作用
cv2.getVersionString()返回OpenCV的版本
cv2.imread(文件地址,图片灰彩类型)

读取文件,用于实例化对象

灰彩类型:(可以不写)

cv2.IMREAD_COLOR读入彩色图像cv2.IMREAD_GRAYSCALE读入灰色图像

对象.shape返回图片的大小(像素)
cv2.imshow(窗口名,图片对象)返回个窗口用于展示这个图片
cv2.waitKey(自动关闭时间)

窗口不自动关闭,知道按下任意键或者到规定时间(时间为微秒)

返回他按得键的代号数字

到时间返回-1

cv2.imwrite(保存路径和文件名,保存的图片)保存编辑的图片

注意:

这个库不支持任何中文!!!!!

不管是图片文件命名还是窗口等

一律别用中文!!!!!!!

(至少我的版本不支持任何中文)

案例演示:

import cv2#导入库
print(cv2.getVersionString())#返回版本号
image=cv2.imread("konglong.jpg")#导入图片,实例化
print(image.shape)#返回图片的大小和通道

cv2.imshow("阿萨德",image)#展示图片
cv2.waitKey(1000)#设置暂停
cv2.imwrite("okok.jpg",image)#保存图片

结果:

打印信息

保存okok图片

展示图片(代码中用中文做窗口所以会乱码)

 视频的打开方式

我们视频有两种:摄像头,视频文件

用到的函数:

读取视频或摄像头:cv2.VideoCapture(视频或者摄像头的指针)
返回视频读取的照片:cap.read()

开启摄像头

思路:原理就是对这摄像头一遍遍截图。然后我们不断的刷新显示的图片。

代码如下:

import cv2#导入库
cap=cv2.VideoCapture(0)#读取摄像头
while True:#循环
    valu,video=cap.read()#读取摄像头内容
    show=cv2.imshow("video",video)#展示摄像头
    key=cv2.waitKey(1)#设置等待0.001秒刷新一次
    print(key)
    if key!=-1:#如果不是到时间刷新的视频就退出视频
        break

结果如下:

 按下别的键就关闭了。(字母有时候不行,数字或者特殊按键相对靠谱点)

视频打开方式

代码:

import cv2#导入库
cap=cv2.VideoCapture("bingdu.mp4")
while True:
    valu,video=cap.read()
    show=cv2.imshow("video",video)
    key=cv2.waitKey(1)
    print(key)
    if key!=-1:
        break

基本一样不截图了

灰度图获取与处理

介绍:OpenCV储存图片实际上是储存三原色的三张图片,最后整合在一起。采用bgr图像。

灰度加权平均:

cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

展示隔色彩图像:

cv2.imshow("blue",image[:,:,0])
cv2.imshow("green",image[:,:,1])
cv2.imshow("red",image[:,:,2])

用法演示:(图片太大不展示效果了)

import cv2
image=cv2.imread("konglong.jpg")
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()

裁剪图像

crop=image[y轴开始裁剪位置:结束位置,x轴开始裁剪位置:结束位置]

水平为x,垂直为y

案例演示:

import cv2
image=cv2.imread("konglong.jpg")
print(image.shape)
y,h,x,w=100,300,100,600
crop=image[y:h,x:w]
cv2.imshow("crop",crop)
cv2.waitKey()

图形绘制

可用于标记识别的物品

(注意,所有的粗细参数输入负数后就是填充图像)

绘制直线

cv2.line(图片, 起点坐标, 终点坐标, 颜色, 粗细)

案例演示

import cv2
image=cv2.imread("okok.jpg")
cv2.line(image,(0,0),(700,600),(255,45,65),4)
cv2.imshow("image",image)
cv2.waitKey()

效果演示:

绘制方形

cv2.rectangle(图片, 起点坐标, 终点坐标, 颜色, 粗细)

案例演示

import cv2
image=cv2.imread("okok.jpg")
cv2.rectangle(image,(309,310),(344,352),(255,45,65),4)
cv2.imshow("image",image)
cv2.waitKey()

绘制圆形

cv2.circle(image,原点坐标,半径,颜色,粗细)

案例演示:

import cv2
image=cv2.imread("okok.jpg")
cv2.circle(image,(329,329),30,(255,45,65),4)
cv2.imshow("image",image)
cv2.waitKey()

 椭圆绘制

cv2.ellipse(图片, 中心点坐标, 横纵轴长度(元组), 旋转角度, 起始角度, 结束角度, 颜色, 粗细)

案例演示:

import cv2
image=cv2.imread("okok.jpg")
cv2.ellipse(image, (256, 256), (100, 50), 60, 0, 360, (0, 255, 0), -1)
cv2.imshow("image",image)
cv2.waitKey()

绘制文字

cv2.putText(图片, 文字, 位置, 字体, 文字大小, 颜色, 粗细)

案例演示:

import cv2
image=cv2.imread("okok.jpg")
cv2.putText(image, "how cool am i!", (250, 350), cv2.FONT_HERSHEY_SIMPLEX, 2, (65,54,87), 2)
cv2.imshow("image",image)
cv2.waitKey()

噪点处理

噪点描述:拍摄时信号传输收到干扰产生的杂色,如下:

噪点处理,其实就是让他变模糊,模糊之后边界就会不明显。但是也会影响一定的画面。

所以一般情况下,是对图像的局部噪点严重的区域进行区域内的噪点处理。

注意下面的核必须是奇数。

高斯模糊

cv2.GaussianBlur(图像,高斯核,sigmaX,sigmaY,边界样式)
x与y差越大越模糊,0的话就是自行计算
实际上一般可以用下面形式进行使用
cv2.GaussianBlur(image,(5,5),0)

中值滤过(像素排序取中值平滑处理)

cv2.medianBlur(图片,核)

案例演示

import cv2
image=cv2.imread("zaodian.jpeg")
cv2.imshow("image",image)
gauss=cv2.GaussianBlur(image,(5,5),0,11)
cv2.imshow("gauss",gauss)
median=cv2.medianBlur(image,5)
cv2.imshow("median",median)
cv2.waitKey()

效果演示

图片特征提取

(但是OpenCV提取图像特征的水平有限,如果需要特别的精准可以尝试别的库)

提取图片的特征,比如说转角,边缘,纹理啥的。

提取思路:先把图像给转化为灰度图,然后在灰度图中匹配转角这类的特征。

函数:

cv2.cvtColor(图片,cv2.COLOR_BGR2GRAY) #灰度处理
cv2.goodFeaturesToTrack(图片,最大特征数,点的质量,特征最小的距离)
.ravel()#点的坐标

案例演示

import cv2
image=cv2.imread("okok.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)),2,(255,0,255),-1)
cv2.imshow("corners",image)
cv2.waitKey()

其实这些特征提取也不是特别的精准,看图中的特征点也能看出来,这些特征点也不足以准确的识别这个画面。

图片匹配

原理:

也是把指定的图片转化为灰度图,然后找特征点,之后在指定的图片中匹配有没有相似的特征点。

缺点:

对图片的大小敏感。也就是说我们给的图片距离镜头20m,但是在指定的图片中,这个图片在镜头50m的地方,就会因为大小不同而匹配不到。

解决思路:

可以改变图像的大小进行多次匹配,或者减少匹配的精度要求(误判多)。

(用到了numpy模块)

函数

灰度处理:cv2.cvtColor(图片,cv2.COLOR_BGR2GRAY)
匹配图像:cv2.matchTemplate(gray_video, target, cv2.TM_CCOEFF_NORMED)
获取坐标:numpy.where(match >= 匹配相似度)

案例演示

(我写的这个识别度不是很高,不过能识别基本的功能,有点人工智障)

调用摄像头实时识别书本上的java。

代码案例

import cv2
import numpy as np
image=cv2.imread("java.jpg")
video=cv2.VideoCapture(0)
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
x1,y1=617,608
x2,y2=967,734
target=gray[y1:y2,x1:x2]
cv2.imshow("okk",target)
h,w=target.shape[0:2]
print("{},{}".format(h,w))
a=1
while True:#循环
    valu,video1=video.read()#读取摄像头内容
    gray_video=cv2.cvtColor(video1,cv2.COLOR_BGR2GRAY)
    if a==1:
        a=2
        cv2.imshow("okkk",gray_video)
    match = cv2.matchTemplate(gray_video, target, cv2.TM_CCOEFF_NORMED)
    place = np.where(match >= 0.9)
    print(place)
    for p in zip(*place[::-1]):
        x_1, y_1 = p[0], p[1]
        x_2, y_2 = x_1 + w, y_1 + h
        print(x_1,x_2)
        cv2.rectangle(video1,(x_1, y_2),(x_2, y_2),(156, 124, 21), 1)
    show=cv2.imshow("video",video1)#展示摄像头
    key=cv2.waitKey(1)#设置等待0.001秒刷新一次
    if key!=-1:#如果不是到时间刷新的视频就退出视频
        break

效果演示

嗯人工智障,识别条件特别苛刻。

不过也算是能够完成实时识别的功能了。

图像梯度算法

简介一下图像梯度:

图像梯度就像地理地图的等高线一样。

给我们分辨一个区域的图像像素变化的强度,如果他变化强度比较大,那么他大概率是图形的边缘。可以利用图像的梯度来分辨图像中的不同的物体。

拉普拉斯算子

作用:利用梯度的方法检测图像边缘,轮廓以及纹理。

函数:

常用写法:cv2.Laplacian(图片,cv2.CV_64F)
完整写法:cv2.Laplacian(image, dest, ddepth, ksize, scale, delta, borderType)
image是输入图像,dest是输出图像,ddepth是输出图像的深度,ksize是卷积核的大小,scale是拉普拉斯算子的系数

案例演示:

import cv2
image=cv2.imread("java.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
laplacian=cv2.Laplacian(gray,cv2.CV_64F)
cv2.imshow("yuantu",image)
cv2.imshow("suanfa",laplacian)
cv2.waitKey()

效果演示:

 canny算子

函数:

cv2.Canny(gray,边缘1,边缘2)

原理:

像素变化强度大于边缘2被判定为是边界,小于边界1被判定为不是边界。在两者之间的区域根据已经判断的区域进行判断。

源码如下:

import cv2
image=cv2.imread("java.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
canny=cv2.Canny(gray,100,200)
canny2=cv2.Canny(gray,50,100)
cv2.imshow("yuantu",image)
cv2.imshow("canny",canny)
cv2.imshow("canny2",canny2)
cv2.waitKey()

效果演示:

好处就是自己能规定他判断的严格程度。

阈值算法(二值化)

普通算法

描述:众所周知,我们世界的颜色并不是绝对的黑白,我们由黑白之间可以配出很多种灰色。

我们就可以用这个原理来把这些灰色绝对化。满足某个值的就变成黑色,不满足的就是白色。

这样就可以识别一些黑暗环境中的文字或者物品。

(但也别指望太准,要是拿个你自己都分辨不出来的图片,用这个也不容易。。。)

函数

cv2.threshold(图片,阈值,最大灰度,处理方法)
本案例用的函数:cv2.threshold(gray,100,255,cv2.THRESH_BINARY)
(因为这张照片环境明堂堂的。。。)

案例演示

import cv2
image=cv2.imread("java.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,100,255,cv2.THRESH_BINARY)
cv2.imshow("binary",binary)
cv2.waitKey()

效果演示

分区二值化算法

OpenCV有内置的分区二值化算法,自动计算这个小区域的阈值,并设定合适的阈值。

函数

函数:(案例)
cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,115,1)

该函数有以下参数:

    src: 要二值化的原始图像。

    maxval: 阈值的最大值。

    adaptiveMethod: 用于计算阈值的方法。有两个选项可供选择:cv2.ADAPTIVE_THRESH_MEAN_C和cv2.ADAPTIVE_THRESH_GAUSSIAN_C。推荐使用默认的cv2.ADAPTIVE_THRESH_GAUSSIAN_C。

    thresholdType: 阈值类型。可以是cv2.THRESH_BINARY或cv2.THRESH_BINARY_INV。推荐使用默认的cv2.THRESH_BINARY。

    blockSize: 每个局部区域的大小,用来计算局部阈值。

    C: 从平均值或加权平均值中减去的常数。该参数在计算局部阈值时起到调整阈值的作用。

案例演示

import cv2
image=cv2.imread("java.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
binary_adaptive=cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,115,1)
cv2.imshow("binary",binary_adaptive)
cv2.waitKey()

结果演示

可以看到,明显的比自己写的那个好用。

大金算法

算法原理:找两个最大的值,然后取两个值的中心。让黑白差异最大化。

函数

cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

好处

完全不用咱们自己设置阈值,他自己就可以设置的明明白白的。

但是也有缺点,不如自己设置的完美,有时候可能不是很好用。

案例演示

import cv2
image=cv2.imread("java.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
ret1,binary_otsu=cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow("binary",binary_otsu)
cv2.waitKey()

效果演示

腐蚀与膨胀

腐蚀:就是给图像变瘦一点(减少白色)

膨胀:相反,给图像变胖一点(增加白色)

作用:可以处理图像边缘,放大或者缩小图像的细节。

函数

他们都需要创建一个核

np.ones((5, 5), np.uint8)

膨胀与腐蚀

cv2.erode(图像, kernel)  # 腐蚀
cv2.dilate(图像, kernel)  # 膨胀

案例演示:

import cv2
import numpy as np
image=cv2.imread("java.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
ret1,binary_otsu=cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(binary_otsu, kernel)  # 腐蚀
dilate = cv2.dilate(binary_otsu, kernel)  # 膨胀
cv2.imshow("binary",binary_otsu)
cv2.imshow("er",erosion)
cv2.imshow("di",dilate)
cv2.waitKey()

效果演示:

腐蚀

膨胀

 这里看到,明明是腐蚀但是感觉像是做出膨胀的效果,这是因为这个是腐蚀白色。所以对于黑色来说是膨胀了。

总结

OK,这些就是OpenCV的基础了。

他还有很多深入的算法,需要自己挖掘。

掌握了这些就能实现一些基本的功能了。

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

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

相关文章

AI菜鸟向前飞 — LangChain系列之十四 - Agent系列:从现象看机制(上篇)

上一篇介绍了Agent与LangGraph的基础技能Tool的必知必会 AI菜鸟向前飞 — LangChain系列之十三 - 关于Tool的必知必会 前面已经详细介绍了Promp、RAG,终于来到Agent系列(别急后面还有LangGraph),大家可以先看下这张图&#xff1…

Centos修改系統語言

一、使用命令行修系统语言 1、显示系统当前语言环 [rootkvm-suma ~]# localectl System Locale: LANGen_US.utf8 VC Keymap: cn X11 Layout: cn 2、查看系统支持字符集 [rootkvm-suma ~]# locale -a 2、设置系统语言环境 [rootkvm-suma ~]# localectl set-locale LANGz…

2024年汉字小达人活动4个多月开赛:18道历年选择题和答案、解析

根据近年的安排,2024年第11届汉字小达人比赛还有4个多月就启动,那么孩子们如何利用这段时间有条不紊地备考呢?我的建议是两手准备:①把小学1-5年级的语文课本上的知识点熟悉,重点是字、词、成语、古诗。②把历年真题刷…

Three.js 研究:2、如何让动画线性运动

1、默认的动画含有加速度并非线性的 制作好的动画很明显是非线性的,这是一个运动环,为了让环运行线性进行如下设置。 2、设置动画成为线性动画

移动端开发 笔记01

目录 01 移动端的概述 02 移动端的视口标签 03 开发中的二倍图 04 流式布局 05 弹性盒子布局 01 移动端的概述 移动端包括:手机 平板 便携式设备 目前主流的移动端开发: 安卓设备 IOS设备 只要移动端支持浏览器 那么就可以使用浏览器开发移动端项目 开发移动端 使用…

如何修复 System has not been booted with systemd 报错信息?

如何修复 System has not been booted with systemd 报错信息? 一、问题描述: 我们在学习 linux 系统时,使用 systemd 命令(比如 sudo systemctl status ssh),可能会遇到一个报错信息: System…

HCIP-Datacom-ARST自选题库__ISIS简答【3道题】

1.IS-1S是链路状态路由协议,便用SPF算法进行路由计算。某园区同时部署了IPv4和IPV6井运行IS-IS实现网络的互联互通,如图所示,该网络IPv4和IPV6开销相同,R1和R4只支持IPV4。缺省情况下,计算形成的IPv6最短路径树中&…

Redis内存回收-内存淘汰策略

LFU的访问次数之所以叫做逻辑访问次数&#xff0c;是因为并不是每次key被访问都计数&#xff0c;而是通过运算&#xff1a; 生成0~1之间的随机数R计算 (旧次数 * lfu_log_factor 1)&#xff0c;记录为P如果 R < P &#xff0c;则计数器 1&#xff0c;且最大不超过255访问…

深度学习设计模式之桥接模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 桥接模式是将抽象部分与实现部分分离&#xff0c;使它们都可以独立的变化。 一、介绍 桥接模式是结构型设计模式&#xff0c;主要是将抽象部分与实现部分分离&#x…

老显示器该换了,否则会摧毁你的眼睛~

正文 大家好&#xff0c;我是bug菌~ 今天给大家带来一篇关于程序员护眼的文章&#xff0c;大部分伙计都是敲代码的&#xff0c;即使不是码农&#xff0c;也多半每天要抱着电脑处理各种事务&#xff0c;那么对眼睛来说还是挺大负担的 特别眼睛原本就不好的朋友更加不友好&#x…

[MRCTF2020]Xor

32位程序 主要逻辑 flagMSAWB~FXZ:J:tQJ"N bpdd}8g for i in range(len(flag)):print(chr(ord(flag[i])^i),end)

得帆信息PMO总监李健达受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 上海得帆信息技术有限公司aPaaS业务线副总裁、PMO总监李健达先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“AI时代的PMO工作法”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#x…

如何在群晖NAS安装WPS Office并使用公网地址远程访问处理文档表格

前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊如何在群晖NAS安装WPS Office并使用公网地址远程访问处理文档表格&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&a…

Manjaro linux install RedisGUI (RedisInsight)亲测2024-5-25

Arch 用户仓库(Arch User Repository)(AUR) 是用户选择 基于 Arch Linux 的系统 的一个主要理由。你可以在 AUR 中访问到大量的附加软件。 (LCTT 译注&#xff1a;AUR 中的 PKGBUILD 均为用户上传且未经审核&#xff0c;使用者需要自负责任&#xff0c;在构建软件包前请注意检…

langchain进阶一:特殊的chain,轻松实现对话,与数据库操作,抽取数据,以及基于本地知识库的问答

特殊的chain langchain中的Chain有很多,能够轻松实现部分需求,极致简化代码,但是实现效果与模型智慧程度有关 会话链 效果与LLMChain大致相同 javascript 复制代码 from langchain.chains import ConversationChain from langchain_community.llms import OpenAI conversat…

CSS语法介绍

文章目录 前言一、CSS引入方式1.行内操作2.内部操作3.外部操作 二、常用选择器1.标签选择器2.类选择器3.id选择器4.群组选择器5.后代选择器 三、字体常用设置1.字体类型2.字体大小3.字体样式4.字体粗细 四、div盒子模型1.盒子边框2.外边距3.内边距4.浮动 综合实战案例 前言 以…

基于PLC的地铁屏蔽门系统设计_kaic

摘 要 可编程序控制器&#xff08;PLC&#xff09;是近年来发展迅速的工业控制装置&#xff0c;它因为具有强大的稳定性、安全性以及维修便利等优点而应用于工业企业各个领域。地铁作为当代一二线城市最重要的公共交通工具&#xff0c;其安全性以及稳定性至关重要。 以PLC为控…

【Java】Sping Boot中使用Javax Bean Validation

目录 Javax Bean Validation在Spring Boot中集成Javax Bean Validation使用案例功能测试配置全局异常处理器重新测试返回特定形式的信息方式一方式二 Javax Bean Validation Javax Bean Validation是Java平台的一项规范&#xff0c;旨在提供一种简单且可扩展的方式来验证Java对…

提示优化 | PhaseEvo:面向大型语言模型的统一上下文提示优化

【摘要】为大型语言模型 (LLM) 制作理想的提示是一项具有挑战性的任务&#xff0c;需要大量资源和专家的人力投入。现有的工作将提示教学和情境学习示例的优化视为不同的问题&#xff0c;导致提示性能不佳。本研究通过建立统一的上下文提示优化框架来解决这一限制&#xff0c;旨…

隐私是建立人工智能信任的关键

微信关注公众号网络研究观获取更多。 谷歌的 Astra 是其首款人工智能代理 谷歌继续将生成式人工智能融入网络安全 云的复杂性是我们这个时代最大的安全威胁 云安全最受关注的问题&#xff1a;人工智能生成的代码 企业可以从人工智能中获得转型利益&#xff0c;但确保“隐…