opencv初学记录

准备工作:
1.找一张图片
2.准备python运行环境,并导入库,pip install opencv-python
读取文件,并打印维度

    import cv2  #为什么是cv2不是cv呢,这个2指的是c++的api,是为了兼容老板,cv指的就是c,而不是版本的意思,不要换成cv3
    path = r'./media/1.jpeg'
    print(cv2.getVersionString())
    image = cv2.imread(path)
    print(image.shape)  #输出(720, 1280, 3) 前面代表图片横行和纵列,3表示图片三原色彩色通道

然后把读取到的文件显示到一个窗口

    cv2.imshow("image", image)   #此时如果是加这个窗口会直接闪没
    cv2.waitKey()  #加上这个,按任意键关闭窗口(这个函数会窗体暂停,并等待键盘输入)

图像彩色通道学习
任何颜色都是由RGB按一定比例混合而成的,对openCV来说,存储一张彩色图片,等同于存储三张彩色图片,被存储在opencv的第三个维度上(此图来自b站)
在这里插入图片描述
opencv对颜色的顺序存储是BGR,与常见的RGB相反,当显示器要渲染一张彩色图片,计算机会依次取出图像数据中的三张灰色图,再把它们分别投影到显示器的蓝,绿红的LED芯片上,从而渲染出彩色画面,如下代码将显示下面四个图片

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

在这里插入图片描述

opencv还提供一种彩色图像的灰度变化算法,可以把三个彩色通道的图像做
平方和加权平均,如下,是BRG三原色的平均,他也描述了,图片的明暗分布,如果在计算机视觉中,通常把这个变换后的图像gray称为灰度图,可以基于灰度图,做不同算法,比如黑片检测图片相似度检测等等
在这里插入图片描述

图像的裁剪

    crop = image[10:170, 40:200]  
    # 将图片裁剪

在这里插入图片描述
绘制功能
OpenCV的图像数据,实际是numpy数组数据结构,所以可以直接使用numpy创建一个黑色画布

    image = numpy.zeros([300, 300, 3], dtype=numpy.uint8)      
    # 灰度的数值类型是无符号八位整数

是一个300*300的黑色画布
在这里插入图片描述
画一条线段

    cv2.line(image, (100, 100), (200, 250), (255,0,255), 2) 
    # 线段起点坐标(100, 100),终点坐标(200, 250),线段颜色(255,0,255),线段粗细为两个像素

在这里插入图片描述
加一个矩形

    cv2.rectangle(image, (30,100), (60, 150), (0,255,33), 2) 
    #矩形框第一个顶点坐标30,100。对角对标60,150。颜色为(0,255,33),粗细是两个像素

在这里插入图片描述
加一个圆

    cv2.circle(image, (150,100), 20, (0,12,155), 3)
    #圆心坐标,圆的半径,颜色,粗细

在这里插入图片描述
绘制字符串

    cv2.putText(image, "Hello OpenCV", (100,50) ,0,1,(11,144,67),1,2)   
     # 文字,坐标,字体需序号(0位默认字体),缩放系数,颜色,粗细,线条类型(1为实线)
     # 附加:putText函数不能使用任意字体

在这里插入图片描述
均值滤波–可以去噪点,但是会破坏图像细节

    # 高斯滤波器,高斯内核为5像素,sigema x设置为0,意思是sigema由内核大小来决定
    gauss = cv2.GaussianBlur(image, (5, 5), 0)
    cv2.imshow("image", image)
    cv2.imshow("gauss", gauss)

如下gauss就比原图噪点要少了
在这里插入图片描述

中值滤波器

    image = cv2.imread(path)
    median = cv2.medianBlur(image, 5)   # 设置内核为5个像素
    cv2.imshow("image", image)
    cv2.imshow("median", median)
    cv2.waitKey()

如下
median
合在一起就是

    image = cv2.imread(path)
    gauss = cv2.GaussianBlur(image, (5, 5), 0)  # 高斯滤波器,高斯内核为5像素,sigema x设置为0,意思是sigema由内核大小来决定
    median = cv2.medianBlur(image, 5)   # 设置内核为5个像素
    cv2.imshow("image", image)
    cv2.imshow("gauss", gauss)
    cv2.imshow("median", median)
    cv2.waitKey()

如下
在这里插入图片描述
图像特征的提取—转角特征

    image = cv2.imread(path)
    gary = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 把彩色图像转换为灰度图
    corners = cv2.goodFeaturesToTrack(gary, 500, 0.1, 10)   # 最多返回500个点,点的质量优于0。1,特征点之间的距离大于10个像素
    for corner in corners:      # 遍历,把点标记出来
        x, y = corner.ravel()
        cv2.circle(image, (int(x), int(y)), 3, (255, 0, 255), -1)  
    cv2.imshow("image", image)
    cv2.waitKey()

在这里插入图片描述
opencv的模板匹配学习 — 即,找图片中对应图片

image = cv2.imread(path)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 转换为灰度图片
    template = gray[273:370, 392:492]  #截图这个位置是一个葡萄
    match = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)  # 标准相关匹配算法,把检测图片和被检测图片都标准化,再来计算匹配度,这样保证不受光照的影响
    locations = numpy.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,0,0),2)

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

如下所有葡萄都用黑线框起来了, 在这里,如果图案一样,但是比截取的图片小和大的图案都不会被匹配上,也就是对大小敏感,如果想要不同大小的图都匹配到,可以放大缩小图像,匹配多次
在这里插入图片描述

图像梯度算法,特征点提取和匹配都使用了图像梯度, 就是图像的明暗变化,可以分别计算图像沿水平和垂直方向的明暗变化,再取这两个变化的平方和,就得到了梯度,可以类比地理中的梯度

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

今天面了一个来字节要求月薪23K,明显感觉他背了很多面试题...

最近有朋友去字节面试,面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试,要不是他面试前做足准备,估计都坚持不完后面几轮面试。 其实&…

ChatGPT/InstructGPT详解

前言 GPT系列是OpenAI的一系列预训练文章,GPT的全称是Generative Pre-Trained Transformer,顾名思义,GPT的目的就是通过Transformer为基础模型,使用预训练技术得到通用的文本模型。目前已经公布论文的有文本预训练GPT-1&#xff…

【操作系统】计算机操作系统知识点总结

文章目录 前言一、操作系统的概念与发展二、操作系统的结构与功能1、操作系统的结构2、操作系统的功能 三、进程管理1、进程2、进程的创建3、进程管理的实现4、进程控制块 四、内存管理1、内存2、内存管理3、内存管理的实现 五、文件系统1、文件系统2、文件系统的主要任务3、文…

Java开发 - 带你了解集群间的相互调用,你还在等什么?

目录 前言 导读 项目准备 集群准备 父工程引入子项目 服务调用方HelloService准备 pom文件 yml文件 Controller文件 服务提供方HelloWorld准备 pom文件 yml文件 Controller文件 运行此两个工程 hello_world组集群 集群调用测试 RestTemplate换成Dubbo行不行…

Word 2021入门指南:详细解读常用功能

软件安装:办公神器office2021安装教程,让你快速上手_正经人_____的博客-CSDN博客 一、 新建文档 打开Word 2021后,可以看到左上角的“文件”选项,点击它,在弹出的菜单中选择“新建”选项。然后可以选择空白文档或者使…

Linux安装和配置VCenter

Linux安装和配置VCenter 以下演示安装 Linux VCenter,也就是使用VMware-VCSA-all-6.7.0-13010631.iso 镜像包。通过一台 Windows服务器远程连接 ESXI 服务器安装 Linux 版本的 VCenter。也就是Windows 服务器只是安装的界面的一个载体。 Linux VCenter环境搭建 下…

网络安全入门学习第十七课——PHP数组

文章目录 一、索引数组二、关联数组三、数组定义1、多维数组2、赋值方式3、短数组定义法([ ] PHP 5.4起增加的) 四、访问数组五、遍历数组1、使用 for 循环2、foreach语句遍历 六、合并两个数组1、“”联合运算符2、array_combine 函数 七、数组排序函数八、数组增删…

低成本开发专属小程序支持自定义开发设计

传统定制开发小程序成本高,还需要不断地沟通和交流才能一步步地去实现你想要的功能和效果,那么除了传统的定制开发小程序外,用户其实还可以选择使用模板开发小程序,不仅能实现小程序的所有基础功能,还不用编程维护和开…

基于html+css的图展示128

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Rust语言从入门到入坑——(3)小谈Cargo工具以及VScode配置Rust

文章目录 0 引入1、Cargo 是什么2、常用Cargo指令3、VScode配置Rust环境3.1.tasks.json3.2.launch.json 4、总结 0 引入 上一节我们谈了在编译工程的时候用到Cargo(卡狗) 1、Cargo 是什么 Cargo 是 Rust 的构建系统和包管理器。 Rust 开发者常用 Carg…

AI翻唱整合

感谢阅读 不完全原创声明环境部署下载工具包安装人声背景音分离工具分离消除脏数据(比如杂音)准备自己的声音预处理完工效果参考 不完全原创声明 本人使用了多个第三方软件,并修改了一部分代码使得其可以在PC上训练,如有侵权请联…

《项目实战》构建SpringCloud alibaba项目

文章目录 1、概要2、整体架构流程2.1、技术结构组成部分 3、技术名词解释4、技术细节4.1、构建父工程4.1.1、选择构建Maven项目4.1.2、修改父工程文件4.1.3、修改父工程pom.xml配置4.1.3.1、添加springboot支持4.1.3.2、修改JDK版本、编码、springboot版本配置4.1.3.3、添加Spr…

完美解决 RabbitMQ 可视化界面中 Overview 不显示图形的问题

💧 记录一下今天遇到的 b u g \color{#FF1493}{记录一下今天遇到的bug} 记录一下今天遇到的bug💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云的博客🎐 🐳 数据结构与算法…

拷贝构造函数

拷贝构造函数 以值传递的方式调用函数时,如果实参为对象,会调用拷贝构造函数。函数以值的方式返回对象时,可能会调用拷贝构造函数(VS会调用,Linux不会,g编译器做了优化)浅拷贝存在的问题 类似于…

反射---getattr,hasattr,setattr,delattr加插播enumerate

什么是反射? 用字符串数据类型的变量名来访问这个变量的值 反射的方法:getattr,hasattr,setattr,delattr 类:(通过类名反射类名空间里面的内容的) 类:静态属性,类方法,静…

【python】flask+pymysql 实现Web端操作数据库!

Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。 Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用…

Qt5.15.10+msvc2019_x86+qwebengine(含mp4)源码编译

系统要求: win10 64bit 英文版(或者把“区域”->“管理”->“非Unicode程序中所使用的当前语言”->改为"英语(美国)") 内存16g够用,cpu性能越高越好,硬盘在安装环境、下载源码后,至少还有100g可用空间 下载源码: https://download.qt.io/archiv…

大话设计模式之——单例模式

单例(Singleton) Intent 确保一个类只有一个实例,并提供该实例的全局访问点。 Class Diagram 使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。 私有构造函数保证了不能通过构造函数来创建对象实例,只能…

Python零基础入门(二)——IDE介绍以及Python+PyCharm的安装

系列文章目录 个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页 Python入门专栏:《Python入门》欢迎阅读,一起进步!🌟🌟🌟 码字不易,如果觉得文章不…

路径规划算法:基于适应度相关优化的路径规划算法- 附代码

路径规划算法:基于适应度相关优化的路径规划算法- 附代码 文章目录 路径规划算法:基于适应度相关优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能…