openCV入门

简介

 本文主要通过对啥都会一点研究生系列进行总结,对关键代码进行注释,方便使用以及复习。

1 基础功能

 1.1.显示图片

import cv2
# 读取图片
img = cv2.imread("Resources/lena.png")
# 显示图片
cv2.imshow("Lena Soderberg",img)
# 毫秒级延时 0表示一直延时 1000表示一秒
cv2.waitKey(0)

1. 2.显示视频

import cv2
# 导入视频
cap = cv2.VideoCapture("Resources/test_ video.mp4")
while True:# success:布尔值是否为真success, img = cap.read()# 视频框名称cv2.imshow("Result", img)# 按q 中断循环if cv2.waitKey(1) & 0xFF == ord('q'):break

1.3.摄像头显示 

import cv2
frameWidth = 640
frameHeight = 480
# 0:默认相机序号
cap = cv2.VideoCapture(0)
# 参数:3:在视频流的帧的宽度
# 参数:4:在视频流的帧的高度
# 参数:10:在视频流的帧的亮度
cap.set(3, frameWidth)
cap.set(4, frameHeight)
cap.set(10,150)
while True:success, img = cap.read()cv2.imshow("Result", img)if cv2.waitKey(1) & 0xFF == ord('q'):break

1.4 图像预处理

import cv2
import numpy as npimg = cv2.imread("Resources/lena.png")
kernel = np.ones((5,5),np.uint8)
# 颜色转换成灰色图
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 图像模糊化
# 7,7可以不同,数越大越模糊,但都必须为正数和奇数,也可以为零,标准差取0
imgBlur = cv2.GaussianBlur(imgGray,(7,7),0)
# 边缘检测
imgCanny = cv2.Canny(img,150,200)
# 膨胀处理
imgDialation = cv2.dilate(imgCanny,kernel,iterations=1)
# 腐蚀处理
imgEroded = cv2.erode(imgDialation,kernel,iterations=1)cv2.imshow("Gray Image",imgGray)
cv2.imshow("Blur Image",imgBlur)
cv2.imshow("Canny Image",imgCanny)
cv2.imshow("Dialation Image",imgDialation)
cv2.imshow("Eroded Image",imgEroded)
cv2.waitKey(0)

2.调整图像大小

2.1 尺寸修改

import cv2
import numpy as npimg = cv2.imread("Resources/shapes.png")
# 打印图像尺寸
print(img.shape)# 对于选中图像修改高宽
imgResize = cv2.resize(img,(1000,500))
print(imgResize.shape)# 剪切图像
imgCropped = img[46:119,352:495]cv2.imshow("Image",img)
# cv2.imshow("Image Resize",imgResize)
cv2.imshow("Image Cropped",imgCropped)cv2.waitKey(0)

2.2 图形绘制与文字添加

import cv2
import numpy as np# 创建矩阵
img = np.zeros((512,512,3),np.uint8)
#print(img)
#img[:]= 255,0,0# 创建线条
cv2.line(img,(0,0),(img.shape[1],img.shape[0]),(0,255,0),3)
# 创建矩形
cv2.rectangle(img,(0,0),(250,350),(0,0,255),2)
# 创建圆形
cv2.circle(img,(400,50),30,(255,255,0),5)
# 添加字 
cv2.putText(img," OPENCV  ",(300,200),cv2.FONT_HERSHEY_COMPLEX,1,(0,150,0),3)cv2.imshow("Image",img)cv2.waitKey(0)

3.图像基础操作

3.1.图像透视

import cv2
import numpy as npimg = cv2.imread("Resources/cards.jpg")width,height = 250,350
pts1 = np.float32([[111,219],[287,188],[154,482],[352,440]])
pts2 = np.float32([[0,0],[width,0],[0,height],[width,height]])# 透视变换
# 使用getPerspectiveTransform()得到转换矩阵
matrix = cv2.getPerspectiveTransform(pts1,pts2)
#使用warpPerspective()进行透视变换
imgOutput = cv2.warpPerspective(img,matrix,(width,height))cv2.imshow("Image",img)
cv2.imshow("Output",imgOutput)cv2.waitKey(0)

3.2.图像拼接

import cv2
import numpy as npimg = cv2.imread('Resources/lena.png')
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)imgStack = stackImages(0.5,([img,imgGray,img],[img,img,img]))
# 水平拼接
imgHor = np.hstack((img,img))
# 垂直拼接
imgVer = np.vstack((img,img))cv2.imshow("Horizontal",imgHor)
cv2.imshow("Vertical",imgVer)

缩小图像拼接

import cv2
import numpy as npdef stackImages(scale,imgArray):rows = len(imgArray)cols = len(imgArray[0])rowsAvailable = isinstance(imgArray[0], list)width = imgArray[0][0].shape[1]height = imgArray[0][0].shape[0]if rowsAvailable:for x in range ( 0, rows):for y in range(0, cols):if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)else:imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)imageBlank = np.zeros((height, width, 3), np.uint8)hor = [imageBlank]*rowshor_con = [imageBlank]*rowsfor x in range(0, rows):hor[x] = np.hstack(imgArray[x])ver = np.vstack(hor)else:for x in range(0, rows):if imgArray[x].shape[:2] == imgArray[0].shape[:2]:imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)else:imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)hor= np.hstack(imgArray)ver = horreturn verimg = cv2.imread('Resources/lena.png')
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)imgStack = stackImages(0.5,([img,imgGray,img],[img,img,img]))# imgHor = np.hstack((img,img))
# imgVer = np.vstack((img,img))
#
# cv2.imshow("Horizontal",imgHor)
# cv2.imshow("Vertical",imgVer)
cv2.imshow("ImageStack",imgStack)cv2.waitKey(0)

3.3 色块检测

import cv2
import numpy as np# 图像拼接
def stackImages(scale,imgArray):rows = len(imgArray)cols = len(imgArray[0])rowsAvailable = isinstance(imgArray[0], list)width = imgArray[0][0].shape[1]height = imgArray[0][0].shape[0]if rowsAvailable:for x in range ( 0, rows):for y in range(0, cols):if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)else:imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)imageBlank = np.zeros((height, width, 3), np.uint8)hor = [imageBlank]*rowshor_con = [imageBlank]*rowsfor x in range(0, rows):hor[x] = np.hstack(imgArray[x])ver = np.vstack(hor)else:for x in range(0, rows):if imgArray[x].shape[:2] == imgArray[0].shape[:2]:imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)else:imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)hor= np.hstack(imgArray)ver = horreturn ver# 图形轮廓函数
def getContours(img):# 输入参数:# img   : 单通道二值图像,白色是前景# RETR_EXTERNAL  : 只返回最外边的轮廓, hierarchy[i][2]=hierarchy[i][3]=-1# CHAIN_APPROX_NONE   :  存储轮廓上的所有点# 输出参数:# contours    : 轮廓  M*N  M是轮廓个数  N是每个轮廓的点# hierarchy   : 轮廓等级关系 M*4contours,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)for cnt in contours:# 轮廓面积area = cv2.contourArea(cnt)print(area)if area>500:# 第一个参数是指明在哪幅图像上绘制轮廓;image为三通道才能显示轮廓# 第二个参数是轮廓本身,在Python中是一个list;# 第三个参数指定绘制轮廓list中的哪条轮廓,# 如果是 - 1,则绘制其中的所有轮廓。后面的参数很简单。# 其中thickness表明轮廓线的宽度,如果是 - 1(cv2.FILLED),则为填充模式cv2.drawContours(imgContour, cnt, -1, (255, 0, 0), 3)# 轮廓周长/弧长 第二参数:指定对象的形状是闭合的(True)#                     还是打开的(一条曲线)。peri = cv2.arcLength(cnt,True)#print(peri)# 轮廓逼近#该参数是一个正数,其值越小则逼近程度越高。# 通常建议使用轮廓周长的一定比例来计算该参数,常见的比例因子为0.01。approx = cv2.approxPolyDP(cnt,0.02*peri,True)print(len(approx))objCor = len(approx)x, y, w, h = cv2.boundingRect(approx)if objCor ==3: objectType ="Tri"elif objCor == 4:aspRatio = w/float(h)if aspRatio >0.98 and aspRatio <1.03: objectType= "Square"else:objectType="Rectangle"elif objCor>4: objectType= "Circles"else:objectType="None"cv2.rectangle(imgContour,(x,y),(x+w,y+h),(0,255,0),2)cv2.putText(imgContour,objectType,(x+(w//2)-10,y+(h//2)-10),cv2.FONT_HERSHEY_COMPLEX,0.7,(0,0,0),2)path = 'Resources/shapes.png'
img = cv2.imread(path)# 复制图像
imgContour = img.copy()
# 灰度图
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 模糊
imgBlur = cv2.GaussianBlur(imgGray,(7,7),1)
# 边缘检测
imgCanny = cv2.Canny(imgBlur,50,50)
getContours(imgCanny)
# 定义空矩阵
imgBlank = np.zeros_like(img)
imgStack = stackImages(0.8,([img,imgGray,imgBlur],[imgCanny,imgContour,imgBlank]))cv2.imshow("Stack", imgStack)
cv2.waitKey(0)

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

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

相关文章

【Java集合类篇】HashMap的数据结构是怎样的?

HashMap的数据结构是怎样的? ✔️HashMap的数据结构✔️ 数组✔️ 链表 ✔️HashMap的数据结构 在Java中&#xff0c;保存数据有两种比较简单的数据结构: 数组和链表&#xff08;或红黑树&#xff09;。 HashMap是 Java 中常用的数据结构&#xff0c;它实现了 Map 接口。Has…

STM32 CubeMX产生的程序架构

使用STM32CubeMX产生启动相关代码&#xff0c;配置各种外设。在后续程序开发过程中&#xff0c;有可能使用STM32CubeMX逐步产生使用的代码&#xff0c;为了将其产生的代码和我们程序隔离&#xff0c;一种可行的程序架构如下&#xff1a; 在此架构中&#xff0c;STM32CubeMX产生…

GraphQL和REST API的区别

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 GraphQL&#xff08;Graph Query Language&#xff09;和REST&#xff08;Representational State Transfer&#xff09;是两种用于构建和设计API的不同方法。以下…

【设计模式之美】理论一:怎么才算是单一原则、如何取舍单一原则

文章目录 一. 如何判断类的职责是否足够单一&#xff1f;二. 类的职责是否设计得越单一越好&#xff1f; 开始学习一些经典的设计原则&#xff0c;其中包括&#xff0c;SOLID、KISS、YAGNI、DRY、LOD 等。 本文主要学习单一职责原则的相关内容。 单一职责原则的定义&#xff1a…

电脑屏幕一直闪烁怎么解决?三大妙招还你清晰视野

电脑屏幕闪烁一直是困扰用户的一个问题&#xff0c;它会影响到用户的使用体验&#xff0c;甚至可能导致眼睛疲劳和头痛。可是电脑屏幕一直闪烁怎么解决呢&#xff1f;在本文中&#xff0c;我们将介绍三个解决电脑屏幕闪烁的方法&#xff0c;从简单的软件调整到硬件检测&#xf…

亚马逊图片上传后变模糊怎么办?亚马逊图片优化指南—站斧浏览器

亚马逊图片上传后变模糊怎么办&#xff1f; 使用高分辨率图片&#xff1a;亚马逊建议卖家使用至少1000 x 1000像素的高分辨率图片。如果您上传的图片分辨率较低&#xff0c;亚马逊系统可能会将其自动调整为较小的尺寸&#xff0c;导致图片模糊。因此&#xff0c;确保您使用高质…

对JAVA行业的深度思考职业规划

JAVA行业的发展趋势 首先&#xff0c;随着移动互联网的快速发展&#xff0c;移动应用程序的需求也越来越大。在这个领域&#xff0c;Java一直是主要的开发语言之一&#xff0c;特别是在Android平台上。然而&#xff0c;随着谷歌推出了Kotlin语言作为Android开发的首选语言&…

Vue3.0+Echarts (可视化界面)

Vue3.0Echarts &#xff08;可视化界面&#xff09; 1. 简介2. 安装2.1 下载安装Node.js2.2 全局下载项目脚手架2.3 创建项目 1. 简介 2. 安装 2.1 下载安装Node.js 2.2 全局下载项目脚手架 以管理员身份执行 npm install -g vue/cli vue --version2.3 创建项目 vue crea…

读书之unix环境高级编程_简单笔记1(初步)

手头有比较多的技术书籍&#xff0c;弃之可惜&#xff0c;放之惭愧&#xff0c;借助空闲时间&#xff0c;先草读&#xff0c;再demo整理。 unix环境高级编程 草读简单整理&#xff0c;为下一步整理细节技术点做准备&#xff08;仅个人笔记&#xff09;。 基本的文件操作&…

java与Android开发入门指南

Java与Android开发是当前非常热门的技术领域&#xff0c;它们是构建移动应用程序的核心。在本文中&#xff0c;我们将为您提供一个入门指南&#xff0c;介绍Java和Android开发的基本概念和步骤&#xff0c;帮助您开始学习和掌握这两个技术。 Java 基础知识 在学习 Android 开…

基于Java SSM框架实现宠物管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现宠物管理系统演示 摘要 随着我国经济的快速发展&#xff0c;人民生活水平的不断提高&#xff0c;宠物逐渐成为许多宠物爱好者的一种生活方式。 宠物的品种也越来越多样化&#xff0c;宠物不仅能给生活带来乐趣还可以成为空巢老人&#xff0c;独生子女很…

Mysql 查看表注释或字段注释

查看所有表的注释 SELECT table_name 表名, table_comment 表说明 FROM information_schema.TABLES WHERE table_schema ‘数据库名’ ORDER BY table_name 查询所有表及字段的注释 SELECT a.table_name 表名, a.table_comment 表说明, b.COLUMN_NAME 字段名, b.column_commen…

MongoDB批量写入操作

一、概述 MongoDB为客户端提供了批量执行写入操作的能力。批量写入操作影响单个集合。MongoDB允许应用程序确定批量写入操作所需的可接受确认级别。 db.collection.bulkWrite&#xff08;&#xff09;方法提供了执行批量插入、更新和删除操作的能力。 MongoDB还支持通过db.col…

java常见面试题:什么是反射?反射在Java中有哪些应用场景?

反射在计算机科学中是一种机制&#xff0c;通过这种机制程序可以在运行时获取关于类、接口、字段和方法的信息&#xff0c;并可以在运行时对对象进行操作。 在Java中&#xff0c;反射的应用场景主要包括以下几个方面&#xff1a; 框架开发&#xff1a;Java反射机制被广泛应用…

补码的乘法-布斯乘法

前言 本篇文章讲解如何通过逻辑门的形式来实现补码的乘法操作 布斯乘法 A.D.Booth提出了一种补码相乘算法,可以将符号位与数值位合在一起参与运算&#xff0c;直接得出用补码表示的乘积&#xff0c;且正数和负数同等对待。这种算法被称之为Booth (布斯)乘法 下面有两个变量值…

【量化金融】《证券投资学》吴晓求(第四版)(更新中)

这里写目录标题 第一篇 基本知识第1章 证券投资工具名词解释简答题 第2章 证券市场名词解释简答题 第二篇 基本分析第三篇 技术分析第四篇 组合管理第五篇 量化分析与交易策略 第一篇 基本知识 第1章 证券投资工具 名词解释 风险&#xff08;risk&#xff09; 未来结果的不…

【hcie-cloud】【16】业务上云迁移、Rainbow详述

文章目录 前言华为业务迁移解决方案概述业务上云背景概述业务迁移场景需求及挑战业务迁移的价值华为业务迁移解决方案 - 全景图华为业务迁移解决方案的优势 Rainbow迁移工具介绍Rainbow迁移原理介绍Rainbow迁移工具简介Rainbow迁移工具定位Rainbow迁移视图Rainbow迁移原理 - Wi…

flutter 项目安卓开启混淆防止渗透

android/app/build.gradle 配置如下 plugins {id "com.android.application"id "kotlin-android"id "dev.flutter.flutter-gradle-plugin" }def keystorePropertiesFile rootProject.file("key.properties") def keystoreProperties…

JumpServer3.0版本-账号管理

账号列表 我这里已经创建好了所以有很多,可以点击资产树列表分类查看 点击创建按钮,添加账号 资产:如果多个设备的账号密码一致可以在资产同事选中 名称:方便辨识即可 用户名:登录设备的账户名 密码:按你登录需求自行选择 添加按钮旁边还有个“模版添加” 此功能便…

yolov8实战第五天——yolov8+ffmpg实时视频流检测并进行实时推流——(推流,保姆教学)

yolov8实战第一天——yolov8部署并训练自己的数据集&#xff08;保姆式教程&#xff09;_yolov8训练自己的数据集-CSDN博客 yolov8实战第三天——yolov8TensorRT部署&#xff08;python推理&#xff09;&#xff08;保姆教学&#xff09;-CSDN博客 今天&#xff0c;我们继续y…