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.mzph.cn/news/678560.shtml

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

相关文章

题目练习(生死时速2.0版)

题目一(Before an Exam) 题意翻译 题目背景 明天皮特将要考生物。他并不很喜欢生物,但在 d 天前他得知他将不得不参加此次考试。皮特严厉的父母勒令他立即复习,因此他在第 i 天将需要学习不少于 minTimei​ 小时,不…

鸿蒙harmony--TypeScript函数详解

新的一年开始了,每天给自己一个微笑,笑里有幸福,原谅生活中的不完美,宽容生活中的不容易,删除昨天的烦恼,开启今天的快乐! 目录 一,函数类型表达式 二,调用签名 三&#…

人工智能深度学习入门指南

随着人工智能(AI)技术的飞速发展,深度学习作为其重要分支,已经成为许多领域的研究热点。深度学习通过模拟人脑神经网络的运作方式,使得机器能够处理和分析海量的数据,从而实现更高级别的智能。本文将为你提…

Rust入门问题: use of undeclared crate or module `rand`

按照官网学rust,程序地址在这里, 写个猜数字游戏 - Rust 程序设计语言 简体中文版 程序内容也很简单, use std::io; use rand::Rng;fn main() {println!("Guess the number!");let secret_number rand::thread_rng().gen_range…

SPI NOR FLASH和SPI NAND FLASH

SPI NOR FLASH和SPI NAND FLASH是两种不同的存储设备,它们在硬件接口和软件应用上都有所不同。以下是关于这两种存储设备更详细的介绍: 1.SPI NOR FLASH SPI NOR FLASH是一种非易失性存储器,它通过串行接口进行数据传输,具有读写…

VUE学习——事件修饰符

阻止默认事件 <template><a click"onClickHandle" href"https://www.baidu.com">baidu</a><a click.prevent"onClickHandle" href"https://www.baidu.com">baidu</a> </template> <script>…

IT行业有哪些证书含金量高?

1.Amazon Certified Cloud Practitioner 转码小白超友好的一门入门级证书&#xff0c;对于之前没有IT或者project经验的同学也可以轻轻松松顺利拿下&#xff0c;含金量很高可以直接标到linkedln的个人介绍里面。 (1)将如何帮助职业生涯 获得此认证可验证对 AWS Cloud、服务和…

真、开源LLM-OLMo

论文&#xff1a;https://arxiv.org/pdf/2402.00838.pdf Weights https://huggingface.co/allenai/OLMo-7B Code https://github.com/allenai/OLMo Data https://huggingface.co/datasets/allenai/dolma Evaluation https://github.com/allenai/OLMo-Eval Adaptation http…

分享88个表单按钮JS特效,总有一款适合您

分享88个表单按钮JS特效&#xff0c;总有一款适合您 88个表单按钮JS特效下载链接&#xff1a;https://pan.baidu.com/s/1v-qcl8bv2kxZ8a98Xo9UAg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…

【教3妹学编程-算法题】价值和小于等于 K 的最大数字

3妹&#xff1a;2哥&#xff0c;新年好鸭~ 2哥 : 新年好&#xff0c;3妹这么早啊 3妹&#xff1a;是啊&#xff0c;新年第一天要起早&#xff0c;这样就可以起早一整年 2哥 :得&#xff0c;我还不了解你&#xff0c;每天晒到日上三竿 3妹&#xff1a;嘿嘿嘿嘿&#xff0c;一年是…

安装了多个Java版本如何指定特定版本

Java版本问题的实战场景 机器安装了一个JDK 8的安装版本&#xff0c;默认的安装路径是 C:\Program Files\Java&#xff0c;JDK的安装版本同时安装了JDK 和JRE, 安装的路径分别是&#xff1a; JDK 路径&#xff1a; C:\Program Files\Java\jdk1.8.0_361JRE 路径&#xff1a; C…

【Java万花筒】精进Java开发:探秘代码质量的利器与技法

深度剖析Java代码&#xff1a;错误检测与质量提升全攻略 前言 在当今快节奏的软件开发领域&#xff0c;代码质量成为保障项目可维护性和稳定性的关键因素。本文将深入探讨多个Java代码质量与分析工具&#xff0c;为开发者提供全面的了解和实际应用指南。通过这些工具&#xf…

【数据结构和算法】--- 基于c语言排序算法的实现(2)

目录 一、交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare法1.2.2 挖坑法1.2.3 前后指针法 1.3 快速排序优化1.3.1 三数取中法选key1.3.2 递归到小的子区间使用插入排序 1.4 快排非递归版 二、归并排序2.1 归并排序2.1.1 递归版2.1.2 非递归版 一、交换排序 基本思想&#xff1a…

2024-02-11 叮当鸭-平台系统-第三次重构-目标确定

摘要: 对平台系统的第三个版本&#xff0c;做总体规划&#xff0c;明确要达到的目标&#xff0c;功能需求&#xff0c;性能需求。 根据这些所要达到的目标&#xff0c;确定选择何种的方案。方案的成本评估单独进行&#xff0c;本文重点分析要达到的各种目标。 功能需求: 能和…

VSCode:替换空行

有时从不同的编辑器拷贝过来的代码会有很多空行&#xff0c;可以通过以下办法进行删除&#xff1a; 1.按CtrlH弹出替换窗口 2.在查找输入框中输入&#xff1a;^\s*(?\r?$)\n 3.点击使用正则表达式 4.点击全部替换

3d渲染100农场如何使用?渲染100邀请码1a12

3d渲染农场通常用于电影、动画或视觉效果的渲染&#xff0c;本文以广受好评的渲染100农场为例&#xff0c;来讲解它的使用方法。 1、注册账号 前往渲染100官网(http://www.xuanran100.com/?ycode1a12)注册账号&#xff0c; 新用户注册记得填邀请码1a12&#xff0c;有30元大礼…

【软件设计师】——面向对象设计原则

为了提高软件的可维护性、可复用性&#xff0c;增加软件的可扩展性和灵活性&#xff0c;在面向对象编程的过程中我们需要遵守以下六条原则。 开闭原则 定义&#xff1a; 编写的代码需要对 扩展开放 对 修改关闭 &#xff0c;实现 热插拔 的效果。 例&#xff1a;在编写不同皮…

【linux系统体验】-archlinux简易折腾

archlinux 一、系统安装二、系统配置及美化2.1 中文输入法2.2 安装virtualbox增强工具2.3 终端美化2.4 桌面面板美化 三、常用命令 一、系统安装 安装步骤人们已经总结了很多很全: Arch Linux图文安装教程 大体步骤&#xff1a; 磁盘分区安装 Linux内核配置系统&#xff08;…

2024年华为OD机试真题-执行任务赚积分-Python-OD统一考试(C卷)

题目描述: 现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。 每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。 可用于处理任务的时间有限,请问在有限的时间内,可获得的最多积分。 输入…

css2复合选择器

一.后代&#xff08;包含&#xff09;选择器&#xff08;一样的标签可以用class命名以分别&#xff09; 空格表示 全部后代 应用 二.子类选择器 >表示 只要子不要孙 应用 三.并集选择器 &#xff0c;表示 代表和 一般竖着写 应用 四.伪类选择器&#xff08;包括伪链接…