OpenCV基础

OpenCV简介

OpenCV是一个功能强大的开源计算机视觉和机器学习软件库,它在图像处理和视频分析领域得到了广泛应用。OpenCV最初由英特尔公司于1999年发起并支持,后来由Willow Garage和Itseez(现在是Intel的一部分)维护。它是为了推动机器视觉领域的实时应用而开发的。OpenCV提供了丰富的算法,包括但不限于图像处理、物体和特征检测、物体识别、3D重建等。这些算法经过优化,可以在多种硬件平台上高效运行。OpenCV被广泛应用于面部识别、物体识别、运动跟踪、机器人视觉以及许多其他的计算机视觉应用中。

OpenCV的优势:

  • OpenCV基于C++实现,同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Python API,结合了OpenCV C++ API和Python语言的最佳特性。 
  • 可以在不同的系统平台上使用。

 OpenCV-Python是一个Python绑定库,解决计算机视觉问题。

OpenCV-Python继承了OpenCV的多平台、轻量级和高效的特点,为Python开发者提供了丰富的计算机视觉功能。以下是OpenCV-Python的一些详细介绍:

  1. 接口封装:OpenCV-Python是OpenCV库C++实现的Python包装器。这意味着OpenCV-Python是对C++版本的OpenCV进行了Python风格的封装,使得Python开发者能够轻松地调用OpenCV的功能。
  2. 快速原型设计:OpenCV-Python非常适合用于计算机视觉问题的快速原型设计。它的设计使得开发者可以迅速实现想法并测试算法。
  3. 模块组成:OpenCV-Python包含了多个模块,每个模块都有其特定的应用场景。了解这些模块的功能和用途对于有效使用OpenCV-Python至关重要。
  4. 学习资源:为了掌握OpenCV-Python,官方提供了丰富的学习资源,包括官方网站、手册和入门教程。这些资料是学习和解决问题的重要参考。
  5. 安装与测试:在开始使用OpenCV-Python之前,需要确保已经正确安装了相关库,并且通过查询版本信息来验证安装是否成功。

图像的基础操作 

 读取图像

cv.imread()

参数:

  • 要读取的图像

  • 读取方式的标志

  • cv.IMREAD*COLOR:以彩色模式加载图像,任何图像的透明度都将被忽略。这是默认参数。

  • cv.IMREAD*GRAYSCALE:以灰度模式加载图像

  • cv.IMREAD_UNCHANGED:包括alpha通道的加载图像模式。

import numpy as np
import cv2 as cvimg = cv.imread('QQ.jpg',0)

显示图像

cv.imshow()

  • 显示图像的窗口名称,以字符串类型表示
  • 要加载的图像

保存图像

cv.imwrite() 

  • 文件名,保存在哪里
  • 保存的图像

cv.imwrite('messigray.png',img)

 读取一张图片,将其转换为灰度图像,并显示出来:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltimg = cv.imread('messi5.jpg',0)cv.imshow('image',img)plt.imshow(img[:,:,::-1])
plt.title('匹配结果'), plt.xticks([]), plt.yticks([])
plt.show()
k = cv.waitKey(0)cv.imwrite('messigray.png',img)

绘制几何图形

绘制直线

cv.line(img,start,end,color,thickness) 

  • img:要绘制直线的图像
  • Start,end: 直线的起点和终点
  • color: 线条的颜色
  • Thickness: 线条宽度

绘制圆形

cv.circle(img,centerpoint, r, color, thickness) 

  • img:要绘制圆形的图像
  • Centerpoint, r: 圆心和半径
  • color: 线条的颜色
  • Thickness: 线条宽度,为-1时生成闭合图案并填充颜色

绘制矩形

cv.rectangle(img,leftupper,rightdown,color,thickness) 

  • img:要绘制的矩形图像
  • Leftupper, rightdown: 矩形的左上角和右下角坐标
  • color: 线条的颜色
  • Thickness: 线条宽度

 向图像中添加文字

cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)

实战: 

import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltimg = np.zeros((512,512,3), np.uint8)cv.line(img,(0,0),(511,511),(255,0,0),5)
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
cv.circle(img,(447,63), 63, (0,0,255), -1)
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)plt.imshow(img[:,:,::-1])
plt.title('匹配'), plt.xticks([]), plt.yticks([])
plt.show()

 几何变换

图像缩放

cv2.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR) 

  • src : 输入图像

  • dsize: 绝对尺寸,直接指定调整后图像的大小

  • fx,fy: 相对尺寸,将dsize设置为None,然后将fx和fy设置为比例因子即可

  • interpolation:插值方法

import cv2 as cv
#  读取图片
img1 = cv.imread("dog.jpeg")rows,cols = img1.shape[:2]
res = cv.resize(img1,(2*cols,2*rows),interpolation=cv.INTER_CUBIC)res1 = cv.resize(img1,None,fx=0.5,fy=0.5)cv.imshow("orignal",img1)
cv.imshow("enlarge",res)
cv.imshow("shrink)",res1)
cv.waitKey(0)fig,axes=plt.subplots(nrows=1,ncols=3,figsize=(10,8),dpi=100)
axes[0].imshow(res[:,:,::-1])
axes[0].set_title("尺度)")
axes[1].imshow(img1[:,:,::-1])
axes[1].set_title("原图")
axes[2].imshow(res1[:,:,::-1])
axes[2].set_title("尺度")
plt.show()

 图像平移

cv.warpAffine(img,M,dsize)

  • img: 输入图像

  • M: 2∗∗3移动矩阵

 图像旋转

cv2.getRotationMatrix2D(center, angle, scale)

  • center:旋转中心
  • angle:旋转角度
  • scale:缩放比例
import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltimg = cv.imread("image.jpg")#  图像旋转
rows,cols = img.shape[:2]M = cv.getRotationMatrix2D((cols/2,rows/2),90,1)
# 旋转变换
dst = cv.warpAffine(img,M,(cols,rows))fig,axes=plt.subplots(nrows=1,ncols=2,dpi=100)
axes[0].imshow(img1[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("旋转后")
plt.show()

仿射变换

仿射变换是线性变换与平移的组合,可以保持直线和平行线的性质。它将矩形映射为平行四边形,即变换后各边仍然平行。

图像的仿射变换涉及到图像的形状位置角度的变化,是深度学习预处理中常到的功能,仿射变换主要是对图像的缩放,旋转,翻转和平移等操作的组合。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltimg = cv.imread("image.jpg")rows,cols = img.shape[:2]pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[100,100],[200,50],[100,250]])
M = cv.getAffineTransform(pts1,pts2)dst = cv.warpAffine(img,M,(cols,rows))fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("仿射后")
plt.show()

 透射变换

透视变换是一种中心投影的射影变换,它可以将矩形映射为任意不规则四边形,因此透视变换的自由度更高。透视变换适用于需要模拟三维空间中视角变化的场合,如在计算机视觉中的相机校准、三维重建等,利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使透视面透视轴旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltimg = cv.imread("image.jpg")rows,cols = img.shape[:2]
# 2.1 创建变换矩阵
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[100,145],[300,100],[80,290],[310,300]])T = cv.getPerspectiveTransform(pts1,pts2)dst = cv.warpPerspective(img,T,(cols,rows))fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("透射")
plt.show()

 类似的还有OpenCV处理平滑方法、边缘检测、视频读写等操作和API,后期会更新更多OpenCV相关操作~

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arm发布新的人工智能Cortex-M处理器

Arm发布了一款新的Cortex-M处理器,旨在为资源受限的物联网(IoT)设备提供先进的人工智能功能。这款新的Cortex-M52声称是最小的、面积和成本效率最高的处理器,采用了Arm Helium技术,使开发者能够在单一工具链上使用简化…

android retrofit上传List集合数据

由于接口需要,retrofit上传不能用POST,因为FormUrlEncoded注解跟Body不能共存,所以更改成了QueryMap 因为需要传参,所先将图片集合转成了Hashmap集合,再使用Gson 将集合转成Json 字符串 ,再转成RequestBody 下面介绍一…

一个查看armv8系统寄存器-值-含义的方式

找到解压后的SysReg_xml_v86A-2019-12目录 wget https://developer.arm.com/-/media/developer/products/architecture/armv8-a-architecture/2019-12/SysReg_xml_v86A-2019-12.tar.gz wget https://developer.arm.com/-/media/developer/products/architecture/armv8-a-archi…

Javaweb之SpringBootWeb案例之事务进阶的详细解析

1.3 事务进阶 前面我们通过spring事务管理注解Transactional已经控制了业务层方法的事务。接下来我们要来详细的介绍一下Transactional事务管理注解的使用细节。我们这里主要介绍Transactional注解当中的两个常见的属性: 异常回滚的属性:rollbackFor 事…

mysql、mybatis中SORT

SORT排序 根据数据表sys_series中HOT(int类型)进行升序排列: 原来的数据库中存储: 排序# 结果是HOT字段为null的所有数据都排在最前面,不为null的数据按升序排列 SELECT * FROM sys_series ORDER BY HOT;# 结果是HOT字段为null的所有数据都排在最后面,不为null的数据按数…

随机MM引流源码PHP开源版

引流源码最新随机MM开源版PHP源码,非常简洁好看的单页全解代码没任何加密 直接上传即可用无需数据库支持主机空间

《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(12)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(11) 4.2 PCIe体系结构的组成部件 PCIe总线作为处理器系统的局部总线,其作用与PCI总线类似,主要目的是为了连接处理器系统中的外部设备…

Centos7之忘记Root用户密码的处理方式

Centos7之忘记Root用户密码的处理方式 文章目录 Centos7之忘记Root用户密码的处理方式1.场景描述2. 重置密码1. 重启系统进入编辑界面2. 按方向键下键↓,找到设置语言的地方3. 进入bash界面后,可以输入passwd命令重新设置root密码 1.场景描述 长时间未使…

五分钟用FRP实现win10远程桌面

准备 搭建好FRP的服务器,参考前一篇文章或者FRP官方文档。 步骤 打开github release页面,下载windows版的FRP客户端:https://github.com/fatedier/frp/releases打开服务器配置文件frps.toml,添加kcpBindPort 7000打开配置文件…

QGIS Desktop工具转换png文件为TIF文件

https://qgis.org/ QGIS Desktop 3.34.3 菜单 Layer -> Georeferencer 选择 文件 点击 加载的图片的左上角的点 弹窗中没有数据 录入 0 0 再加入右侧下面的点 调整下 数据 点击 绿色的箭头按钮 输出TIF文件 GeoServer中添加 存储仓库 点击 GeoTIFF 录入,选…

C语言字符常量与字符变量..

1.字符常量 诸如’a’、‘b’、c’这类的都归属于字符常量 而且我们都知道printf()函数接收的第一个参数是字符串 所以不能够直接将字符常量作为printf函数的第一个参数 并且字符常量对应的占位符为%c 以下是对字符常量的演示 int main(){printf("%c%c%c%c", a, b…

【开源】基于JAVA+Vue+SpringBoot的公司货物订单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…