opencv入门笔记(二)

news2024/11/17 20:35:22

目录

  • 图像运算
    • 位运算
      • 位与运算
      • 位或运算
      • 取反运算
      • 异或运算
      • 位运算特点
      • 示例:位运算示例
    • 加法运算
      • 示例:查看三种加法运算的区别
  • 滤波器
    • 均值滤波
    • 中值滤波
    • 高斯滤波
    • 双边滤波
    • 示例:查看多种滤波器的处理效果
  • 视频处理
    • 示例:打开笔记本电脑内置摄像头
  • 人脸识别
    • 级联分类器
    • 人脸跟踪
      • 示例:检测照片中的人脸位置

本博客参考书籍:《python opencv从入门到实践 》

图像运算

位运算

位与运算

cv2.bitwise_and(src1, src2[, dst[, mask]]) 
参数描述
src1待处理图像1
src2待处理图像2
dst经处理后的图像

位或运算

cv2.bitwise_or(src1, src2[, dst[, mask]])
参数描述
src1待处理图像1
src2待处理图像2
dst经处理后的图像

取反运算

cv2.bitwise_not(src[, dst[, mask]]) 
参数描述
src待处理图像
dst经处理后的图像

异或运算

cv2.bitwise_xor(src1, src2[, dst[, mask]]) 
参数描述
src1待处理图像1
src2待处理图像2
dst经处理后的图像

位运算特点

图像的像素值范围在(0-255)之间,经过标准化后范围会缩减到(0-1)之间,此时像素值为0说明该点为纯黑色,像素值为0说明该点为纯白色

与纯白色像素与纯黑色像素
原值纯黑
纯白原值
取反取反取反
异或取反原值

示例:位运算示例

import cv2
import numpy as np
import matplotlib.pyplot as plt
black_img=np.zeros((300,400,3),np.uint8)
# white_img=np.ones((300,400,3),np.uint8)
img=cv2.imread('../imgs/R-C_resize.jpg')

and_img=cv2.bitwise_and(img,black_img)
or_img=cv2.bitwise_or(img,black_img)
not_img=cv2.bitwise_not(img)
xor_img=cv2.bitwise_xor(img,black_img)

plt.subplots_adjust(hspace=0.5)
plt.subplot(221)
plt.title('and_img')
plt.imshow(img)

plt.subplot(222)
plt.title('or_img')
plt.imshow(or_img)

plt.subplot(223)
plt.title('not_img')
plt.imshow(not_img)

plt.subplot(224)
plt.title('xor_img')
plt.imshow(xor_img)

plt.show()

运行结果
在这里插入图片描述

加法运算

两个图像的每个像素值相加会得到新的图像

  • 简单的"+"运算,当两像素相加和超过255时,新像素值会取两者的和对255取模运算的结果
  • add()方法,当两像素相加和超过255时,新像素值取255
  • addWeighted()方法,对两个图像的像素值进行加权求和

示例:查看三种加法运算的区别

我们先来看一下原始图像
在这里插入图片描述

import cv2
import matplotlib.pyplot as plt

img1=cv2.imread('../imgs/mountain3.jpg')
img2=cv2.imread('../imgs/mountain8.jpg')
img1=cv2.resize(img1,(600,400))
img2=cv2.resize(img2,(600,400))
row,column,channel=img1.shape

_img=img1+img2
add_img=cv2.add(img1,img2)
addweight_img=cv2.addWeighted(img1,0.8,img2,0.5,0)

plt.subplots_adjust(hspace=0.5)
plt.subplot(221)
plt.title('_img')
plt.imshow(_img)

plt.subplot(222)
plt.title('add_img')
plt.imshow(add_img)

plt.subplot(223)
plt.title('addweight_img')
plt.imshow(addweight_img)

plt.show()

运行结果

在这里插入图片描述

滤波器

均值滤波

cv2.blur(src, ksize[, dst[, anchor[, borderType]]])
参数描述
src待处理图像
dst经处理后的图像
ksize滤波核大小

中值滤波

cv2.medianBlur(src, ksize[, dst])
参数描述
src待处理图像
dst经处理后的图像
ksize滤波核大小(需是奇数且大于1)

高斯滤波

cv2.GaussianBlur(src, ksize, sigma1[, dst[, sigma2[, borderType]]])
参数描述
src待处理图像
dst经处理后的图像
ksize滤波核大小(滤波核长宽可以不同、但是必须是正奇数)
sigma1卷积核水平方向的标准差
sigma2卷积核竖直方向的标准差

双边滤波

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
参数描述
src待处理图像
d以当前像素为中心的整个滤波范围直径
sigmaColor参与计算的颜色范围
sigmaSpace参与计算的像素数量
dst经过处理后的图像

示例:查看多种滤波器的处理效果

import cv2
import matplotlib.pyplot as plt
import matplotlib

plt.subplots_adjust(hspace=0.5)
matplotlib.rcParams['font.family']='SimHei'

img=cv2.imread('../imgs/R-C_resize.jpg')

blur_img=cv2.blur(img,(9,9))
median_img=cv2.medianBlur(img,9)
gaussian_img=cv2.GaussianBlur(img,(13,13),0,0)
bilateral_img=cv2.bilateralFilter(img,15,120,100)

plt.subplot(321)
plt.title('原始图像')
plt.imshow(img)

plt.subplot(322)
plt.title('均值滤波(9x9)')
plt.imshow(blur_img)
#
#
plt.subplot(323)
plt.title('中值滤波(9x9)')
plt.imshow(median_img)

plt.subplot(324)
plt.title('高斯滤波(13x13)')
plt.imshow(gaussian_img)

plt.subplot(325)
plt.title(r'双边滤波(d=15)')
plt.imshow(bilateral_img)

plt.show()

运行结果
在这里插入图片描述

视频处理

cv2.VideoCapture(device) 

参数device:打开的视频捕获设备的Id(即摄像机索引)。如果只连接了一个摄像头,只需传递0即可

示例:打开笔记本电脑内置摄像头

import cv2

camera=cv2.VideoCapture(0)
while camera.isOpened():
	_,img=camera.read()
	cv2.imshow('video',img)
	key=cv2.waitKey(1)
	if key==32:break
camera.release()
cv2.destroyAllWindows()

人脸识别

级联分类器

在目录'..\Lib\site-packages\cv2\data'下存在着opencv官方已经训练好的一些级联分类器,
在这里插入图片描述这些XML文件有着不同的功能
在这里插入图片描述

人脸跟踪

加载级联分类器

cv2.CascadeClassifier(filename)

使用分类器识别图像

cv2.CascadeClassifier.detectMultiScale(image[, scaleFactor[, minNeighbors[, flags[, minSize[, maxSize]]]]])

返回值类型:objects
捕捉到的目标区域数组。每个元素都是一个矩形区域,包含该矩形的左上顶点横纵坐标和长宽,我们可以使用rectangle()函数将该矩形区域绘制在原图像中并返回

参数描述
image待识别的图像
scaleFactor图像缩放比例

示例:检测照片中的人脸位置

我们先准备一张照片
在这里插入图片描述

import cv2

path=r'D:\Myanaconda\envs\SmooFaceEngine-master\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml'
img=cv2.imread('../images/555.png')
# 加载级联分类器
face_recognizor=cv2.CascadeClassifier(path)
# 使用分类器识别图像
faces=face_recognizor.detectMultiScale(img)
for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),5)
cv2.imshow('faces',img)
cv2.waitKey()

cv2.destroyAllWindows()

运行结果
在这里插入图片描述

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

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

相关文章

轻量化神经网络(移动设备上的神经网络)的整体框架

提示:不断更新中 文章目录一、为什么要引入轻量化神经网络二、模型压缩(Model Compression)参数修建低秩因子分解参数量化知识蒸馏人工神经架构设计三、自动压缩和神经架构搜索(Automated Compression and Neural Architecture Search)自动模型压缩(Automated Model…

【软件工程】白盒测试:基本路径测试

基本路径测试是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行的路径集合,从而设计测试用例的方法。 步骤(以一段代码为例): (1)画出控制流图 void sort(int num,int t) 1. { 2. i…

MySQL数据库的SQL语句

MySQL数据库的SQL语句MySQL的常用数据类型MySQL数据类型及含义char与varchar的区别MySQL的基本命令登录数据库查看MySQL数据库版本查看当前服务器中的数据库查看MySQL库中的表查看表的结构(字段)SQL语句SQL简介及分类创建新的数据库创建新的表添加表中各…

卡尔曼滤波之基本概念和状态观测器

图裂参考原文:https://www.cnblogs.com/odesey/p/16937124.html 1. 为什么使用 Kalman Filters? 1.1 什么是 Kalman Filters? Kalman Filters 是一种优化估计算法。下面使用使用两个例子说明 Kalman Filters 的用处。 例子1: …

电子学会2021年3月青少年软件编程(图形化)等级考试试卷(二级)答案解析

目录 一、单选题(共25题,每题2分,共50分) 二、判断题(共10题,每题2分,共20分) 三、编程题(共2题,共30分) 青少年软件编程(图形化&a…

Java#32(异常, File)

目录 一.异常 异常: 代表程序出现问题 二.File 1.File的三种构造方法 2.File的常见的成员方法 一.异常 异常: 代表程序出现问题 图解: 从Java文件------>字节码文件的过程就是编译(在这期间的异常就是编译时异常) 从字节码文件------->运行结果的过程就是运行(在这期…

Linux系统调用与API

系统调用是应用程序与操作系统内核之间的接口,它决定了应用程序是如何与内核打交道的。无论程序是直接进行系统调用,还是通过运行库,最终还是会达到系统调用这个层面。 系统调用介绍 1、什么是系统调用 在现代的操作系统里,程序运…

CEC2015:动态多目标野狗优化算法求解CEC2015(提供完整MATLAB代码,含GD、IGD、HV和SP评价指标)

一、动态多目标优化问题简介 现实世界中,许多优化问题不仅具有多属性,而且与时间相关,即随着时间的变化,优化问题本身也发生改变,这类问题称为动态多目标优化问题(dynamic multi-objective optimization p…

写一个flutter程序—记录

目录 使用外部package 添加一个Stateful widget Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全…

[附源码]Python计算机毕业设计SSM精品旅游项目管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【Pytorch安装】windows下,安装了torch但是import torch失败

【Pytorch安装】windows下,安装了torch但是import torch失败问题原因解决问题 输入 python 进入python环境,输入 import torch 但是显示找不到这个包 输入 pip list 查看之前是否安装成功 但是可以看到包都在 原因 电脑中先前安装了多个 python &am…

Ajax用法总结

目录 Ajax简介 Ajax使用 xhr内部五种状态 Ajax在IE浏览器上存在的缓存问题 如何发送post请求 如何取消Ajax请求 ​编辑 jQuery封装的Ajax如何使用? Ajax简介 Ajax全称为Asynchous Javascript And XML,即异步的JS和XML,通过Ajax可以在…

Linux进程的调度

目录 调度策略与调度类 实时调度策略 普通调度策略 调度类 sched_class有几种实现: 完全公平调度算法 调度队列与调度实体 调度类是如何工作的? 调度策略与调度类 在Linux里面,进程大概可以分成两种。 一种称为实时进程,…

Redis主从复制+哨兵模式

必读 redis的主从复制是单向的,只能有主节点到从节点,主节点以写为主从节点以读为主不能写入数据!因为系统的80%的需求都是读的需求。 redis服务默认自己是主节点,一个主节点由一个或多个从节点,一个从节点只有一个主…

图信号处理论文

图信号处理并且非图神经网络的论文: Donget.al“GraphSignal Processingfor MachineLearning A Review and New Perspectives," ICASSP Tutorial, June 2021. Lorenzoet.al“Adaptiveleast mean squaresestimation ofgraph signals"IEEE Trans. Signal I…

Vue3 学习笔记 —— 破坏式更新、自定义指令 directive

目录 1. 什么叫破坏式更新? 2. Vue3 中的自定义指令 2.1 自定义指令的生命周期 2.1.1 Vue2 Vs Vue3 的自定义指令生命周期 2.1.2 自定义指令的生命周期中,接收的参数 2.2 定义一个自定义指令 2.2.1 在 setup 中定义自定义指令(此处为 …

数据结构 树练习题

目录 判断 选择 判断 1.一棵有124个结点的完全二叉树,其 叶结点个数是确定的。 【答案】正确 【解析】完全二叉树 若设二叉树的深度为h 除第 h 层外 其它各层 1~(h-1) 的结点数都达到最大个数(即1~(h-1)层为一个满二叉树) 第 h 层所有的结点都连续集…

【C++】STL

文章目录回调函数:一、STL的诞生二、STL基本概念三、STL六大组件四、STL中容器,算法,迭代器回调函数: 函数被作为参数传递到另一个函数(主要函数)的那个函数就叫做 回调函数 一、STL的诞生 C的面向对象和…

DHTMLX Diagram JavaScript/HTML5 Pro Library:5.0

Diagram — JavaScript/HTML5 Diagram Library Ω578867473 破解版DHTMLX Diagram comprises a set of interactive HTML5 UI components such as organization charts, flowcharts, decision trees, block diagrams, mind maps, etc. Consisting of nodes and connectors, di…

i.MX 6ULL 驱动开发 二十八:网络设备

一、网络设备的系统框图 MAC:工作在网络模型的数据链路层,通过 RGMII 或 RMII 接口连接 PHY,MAC 控制器中的 MDIO 控制器提供 MDIO 接口,用于访问 PHY 寄存器。 PHY:工作在网络模型的物理层,是 IEEE802.3 …