《Opencv》基础操作<1>

目录

一、Opencv简介

主要特点:

应用领域:

二、基础操作

1、模块导入

2、图片的读取和显示

(1)、读取

(2)、显示

3、 图片的保存

4、获取图像的基本属性

5、图像转灰度图

6、图像的截取

7、图像的缩放

8、图像的旋转

9、膨胀和腐蚀操作

(1)、膨胀操作

(2)、腐蚀操作

 10、图像的轮廓检测

(1)、Sobel 算子轮廓检测法

(2)、findContours 边缘检测算法

(3)、Canny轮廓检测


一、Opencv简介

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一系列C++函数和少量C函数构成,同时也提供了Python、Java、MATLAB等语言的接口。OpenCV的设计目标是提供一个简单易用的计算机视觉框架,以便开发者能够快速实现各种视觉处理任务。

主要特点:

  1. 跨平台支持:OpenCV可以在Windows、Linux、macOS、Android和iOS等多个操作系统上运行。

  2. 丰富的图像处理功能:包括图像的读取、显示、保存、滤波、边缘检测、形态学操作、特征检测与描述、图像分割等。

  3. 视频处理:支持视频的读取、显示、保存,以及视频流的实时处理。

  4. 机器学习:内置了多种机器学习算法,如支持向量机(SVM)、K近邻(KNN)、决策树等,可以用于分类、回归等任务。

  5. 深度学习支持:OpenCV 3.3版本之后,集成了深度学习模块,支持TensorFlow、Caffe、Torch等主流深度学习框架的模型导入和推理。

  6. 高性能:OpenCV的许多算法都经过了优化,能够高效地处理大规模图像和视频数据。

  7. 开源社区支持:OpenCV拥有庞大的用户和开发者社区,提供了丰富的文档、教程和示例代码,方便用户学习和使用。

应用领域:

OpenCV广泛应用于各种计算机视觉和图像处理任务,包括但不限于:

  • 图像处理:如图像增强、滤波、边缘检测等。

  • 视频分析:如目标跟踪、运动检测、行为识别等。

  • 机器视觉:如工业检测、机器人视觉、自动驾驶等。

  • 医学图像处理:如CT、MRI图像的分析与处理。

  • 增强现实:如虚拟物体叠加、实时特效等。

二、基础操作

1、模块导入

import cv2

2、图片的读取和显示

(1)、读取
  • 读取原图
image = cv2.imread('图片名或路径')
  • 读取灰度图

在路径后面加上0,代表以灰度图的形式读取图片

image = cv2.imread('图片名或路径',0)
(2)、显示
import cv2# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.waitKey() 函数 :用于等待用户的按键事件,它的参数表示等待按键的时间(单位是毫秒)。当参数设置为 0 时,意味着程序会一直处于等待状态,直到用户按下任意一个按键为止; 

cv2.destroyAllWindows ( )函数 :作用是关闭所有由 OpenCV 创建的图像显示窗口。

3、 图片的保存

import cv2# 保存图像
cv2.imwrite('output_image.jpg', image)

4、获取图像的基本属性

获取图像的BGR、像素点个数、数据类型。

# 获取图像的宽度和高度
height, width, channels = image.shape# 获取图像的尺寸
size = image.size# 获取图像的数据类型
dtype = image.dtype

5、图像转灰度图

假设一张已经读取的非灰度图想转为灰度图,可用此方法

import cv2gray_img = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

6、图像的截取

注:前面的参数截取的是高,后面的是宽。opencv中的图像坐标原点在图像的左上角。

img_cut = image[0:50,0:50]
# 前面的参数截取的是高,后面的是宽。

7、图像的缩放

import cv2
# 缩放图像
resized_image = cv2.resize(image, (new_width, new_height))

8、图像的旋转

import cv2# 获取图像的中心点
(h, w) = image.shape[:2]
center = (w // 2, h // 2)# 旋转图像
M = cv2.getRotationMatrix2D(center, angle, scale)
rotated_image = cv2.warpAffine(image, M, (w, h))

center:图像的中心点;

angle:旋转的角度,正数为逆时针旋转,负数为顺时针旋转;

scale:图像旋转后的缩放比例;

M:为一个2*3的变换矩阵,会被后续的 cv2.warpAffine 函数用来对图像实际执行旋转(以及缩放,如果有设置缩放比例的话)操作;

(w,h):经过旋转等变换后输出的图像 大小;

9、膨胀和腐蚀操作

(1)、膨胀操作
import cv2
import numpy as npkernel = np.ones(3,3)# 膨胀操作
dilated_image = cv2.dilate(image, kernel, iterations=1)
(2)、腐蚀操作
import cv2
import numpy as npkernel = np.ones(3,3)# 腐蚀操作
eroded_image = cv2.erode(image, kernel, iterations=1)

 iterations参数:用于指定腐蚀操作执行的次数

 10、图像的轮廓检测

注意:轮廓检测最好使用灰度图或者二值化的图,这样检测会更精准。

(1)、Sobel 算子轮廓检测法
import cv2# 水平方向检测
sobelx = cv2.Sobel(image,cv2.CV_64F,1,0,ksize=3)
# 对结果取绝对值,以免负数被截取为0
sobelx = cv2.convertScaleAbs(sobelx)# 垂直方向检测
sobely = cv2.Sobel(image,cv2.CV_64F,0,1,ksize=3)
# 对结果取绝对值,以免负数被截取为0
sobely = cv2.convertScaleAbs(sobely)# 垂直水平方向根据权重进行相加
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)cv2.imshow('',sobelxy)

此种方法最好水平检测与垂直检测分开,然后再求和。如果同时检测效果会不好。 

(2)、findContours 边缘检测算法

使用cv2.findContours()算法时图片必须是灰度图或者经过二值化处理过的图

import cv2# 查找轮廓
contours, hierarchy = cv2.findContours(image_gray, type1, type2)# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)

contours:包含了所有检测到的轮廓信息的列表;

hierarchy:它表示轮廓之间的层次关系信息;

image:表示待检测的图片;

type1(轮廓检测形式)有如下选项:

cv2.RETR_TREE:表示会检索所有的轮廓,并重构嵌套轮廓的完整层次结构;

cv2.RETR_EXTERNAL:只检索最外层的轮廓,忽略所有内部的子轮廓;

cv2.RETR_LIST:检索所有轮廓,但不建立轮廓间的层次关系;

type2(轮廓逼近的方法)有如下选项:

cv2.CHAIN_APPROX_SIMPLE:会压缩水平、垂直和对角方向的线段,仅保留轮廓的端点信息,将轮廓用尽可能少的点来表示,以达到简化轮廓数据的目的;

cv2.CHAIN_APPROX_NONE:存储轮廓的所有边界点,也就是完整地记录轮廓经过的每一个像素点,不进行任何简化,这样得到的轮廓数据会比较详细、准确,但数据量通常很大。

(3)、Canny轮廓检测
import cv2
result_img = cv2.Canny(gray_img,50,150,apertureSize=3,L2gradient=True)
cv2.imshow('result_img',result_img)

50,150:低阈值和高阈值;

apertureSize:Sobel算子核的大小,一般为奇数3,5,7等;

L2gradient:为True时使用采用更为精确的 L2 范数,为False时采用近似的 L1 范数。

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

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

相关文章

【Android】ARouter的使用及源码解析

文章目录 简介介绍作用 原理关系 使用添加依赖和配置初始化SDK添加注解在目标界面跳转界面不带参跳转界面含参处理返回结果 源码基本流程getInstance()build()navigation()_navigation()Warehouse ARouter初始化init帮助类根帮助类组帮助类 completion 总结 简介 介绍 ARouter…

国内首家! 阿里云人工智能平台 PAI 通过 ITU 国际标准测评

近日,阿里云人工智能平台 PAI 顺利通过中国信通院组织的 ITU-T AICP-GA(Technical Specification for Artificial Intelligence Cloud Platform:General Architecture)国际标准和《智算工程平台能力要求》国内标准一致性测评&…

SpringBoot文件上传之秒传、断点续传、分片上传

一 文件上传的常见场景 在日常开发中,文件上传的场景多种多样。比如,在线教育平台上的视频资源上传,社交平台上的图片分享,以及企业内部的知识文档管理等。这些场景对文件上传的要求也各不相同,有的追求速度&#xff…

力扣 最长回文字串-5

最长回文字串-5 //双指针&#xff0c;暴力解法 class Solution { public:bool is(string s, int l, int r) // 判断是否为回文{while (l < r) {if (s[l] ! s[r]) {return false;}l;r--;}return true;}string longestPalindrome(string s) {int Max 0;//用来判断找出最长字…

【算法】快速求出 n 最低位的 1

Leetcode 2438. 二的幂数组中查询范围内的乘积 先展示算法具体实现 while (n) {int lowbit n & (-n);powers.push_back(lowbit);n ^ lowbit; }这段代码的核心是通过 n & (-n) 计算出 n 的 最低位的 1&#xff08;即最右边的 1&#xff09; -n 是 n 的二进制补码表…

数据抽取平台pydatax使用案例---11个库项目使用

数据抽取平台pydatax&#xff0c;前期项目做过介绍&#xff1a; 1&#xff0c;数据抽取平台pydatax介绍--实现和项目使用 项目2&#xff1a; 客户有9个分公司&#xff0c;用的ERP有9套&#xff0c;有9个库&#xff0c;不同版本&#xff0c;抽取的同一个表字段长度有不一样&…

.NET9 - Swagger平替Scalar详解(四)

书接上回&#xff0c;上一章介绍了Swagger代替品Scalar&#xff0c;在使用中遇到不少问题&#xff0c;今天单独分享一下之前Swagger中常用的功能如何在Scalar中使用。 下面我们将围绕文档版本说明、接口分类、接口描述、参数描述、枚举类型、文件上传、JWT认证等方面详细讲解。…

shiny动态生成颜色选择器并将其用于绘图

在 Shiny 中使用 uiOutput 和 renderUI 动态生成 UI 控件是一种灵活的方法。结合 uiOutput(ns("colorSelectors")) 的用法&#xff0c;可以实现动态生成颜色选择器&#xff0c;并响应用户选择进行绘图或更新显示。 代码 library(shiny) library(colourpicker)# UI …

【单点知识】基于PyTorch进行模型部署

文章目录 0. 前言1. 模型导出1.1 TorchScript1.1.1 使用 torch.jit.trace1.1.2 使用 torch.jit.script 1.2 ONNX1.2.1 导出为 ONNX 格式 1.3 导出后的模型加载1.3.1 加载 TorchScript 模型1.3.2 加载 ONNX 模型 2. 模型优化2.1 模型量化2.2 模型剪枝 3. 服务化部署3.1 Flask 部…

‌Kotlin中的?.和!!主要区别

目录 1、?.和!!介绍 2、使用场景和最佳实践 3、代码示例和解释 1、?.和!!介绍 ‌Kotlin中的?.和!!主要区别在于它们对空指针的处理方式。‌ ‌?.&#xff08;安全调用操作符&#xff09;‌&#xff1a;当变量可能为null时&#xff0c;使用?.可以安全地调用其方法或属性…

java基础知识(常用类)

目录 一、包装类(Wrapper) (1)包装类与基本数据的转换 (2)包装类与String类型的转换 (3)Integer类和Character类常用的方法 二、String类 (1)String类介绍 1)String 对象用于保存字符串,也就是一组字符序列 2)字符串常量对象是用双引号括起的字符序列。例如:&quo…

《Hello YOLOv8从入门到精通》5,颈部网络(Neck)结构、核心源码和参数调优

YOLOv8的颈部网络&#xff08;Neck&#xff09;是目标检测模型中的关键组成部分&#xff0c;它位于骨干网络&#xff08;Backbone&#xff09;和头部网络&#xff08;Head&#xff09;之间&#xff0c;主要负责进行特征融合和增强。 在YOLOv8中&#xff0c;颈部网络采用了先进…

C#里怎么样实现单向链表?

C#里怎么样实现单向链表? 数据结构,是程序基本表示方法。 不同的数据结构,就需要采用不同的算法。 在软件开发中,使用到的链表还是比较多的。不过,目前C#语言,基本上都类库, 所以需要自己创建链表的机会,基本不存在了。 但是作为理解原理,还是学习一下吧。 下面的例…

Servlet细节

目录 1 Servlet 是否符合线程安全&#xff1f; 2 Servlet对象的创建时间&#xff1f; 3 Servlet 绑定url 的写法 3.1 一个Servlet 可以绑定多个url 3.2 在web.xml 配置文件中 url-pattern写法 1 Servlet 是否符合线程安全&#xff1f; 答案&#xff1a;不安全 判断一个线程…

对比三种UI交互界面的方案

在嵌入式系统的显示应用领域&#xff0c;如何高效、稳定地驱动TFT LCD显示屏至关重要。当下主流方案有三种&#xff1a; 单片机控制芯片屏 &#xff0c;常见的是瑞佑系列芯片单片机串口屏&#xff0c;常见迪文和大彩单片机内建LCD驱动&#xff0c;常见比如ST32F429等 这三种各…

w~视觉~3D~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12538137 #SIF3D 通过两种创新的注意力机制——三元意图感知注意力&#xff08;TIA&#xff09;和场景语义一致性感知注意力&#xff08;SCA&#xff09;——来识别场景中的显著点云&#xff0c;并辅助运动轨迹和姿态的预测…

fastjson不出网打法—BCEL链

前言 众所周知fastjson公开的就三条链&#xff0c;一个是TemplatesImpl链&#xff0c;但是要求太苛刻了&#xff0c;JNDI的话需要服务器出网才行&#xff0c;BCEL链就是专门应对不出网的情况。 实验环境 fastjson1.2.4 jdk8u91 dbcp 9.0.20 什么是BCEL BCEL的全名应该是…

GitLab使用操作v1.0

1.前置条件 Gitlab 项目地址&#xff1a;http://******/req Gitlab账户信息&#xff1a;例如 001/******自己的分支名称&#xff1a;例如 001-master&#xff08;注&#xff1a;master只有项目创建者有权限更新&#xff0c;我们只能更新自己分支&#xff0c;然后创建合并请求&…

MATLAB GUI设计(基础)

一、目的和要求 1、熟悉和掌握MATLAB GUI的基本控件的使用及属性设置。 2、熟悉和掌握通过GUIDE创建MATLAB GUI的方法。 3、熟悉和掌握MATLAB GUI的菜单、对话框及文件管理框的设计。 4、熟悉和掌握MATLAB GUI的M文件编写。 5、了解通过程序创建MATLAB GUI的方法。 二、内…

RabbitMQ简单应用

概念 RabbitMQ 是一种流行的开源消息代理&#xff08;Message Broker&#xff09;软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP - Advanced Message Queuing Protocol&#xff09;。RabbitMQ 通过高效的消息传递机制&#xff0c;主要应用于分布式系统中解耦应用…