opencv学习整理--基础入门

news2025/7/7 7:51:23

文章目录

      • 读取和显示文件
      • 绘制线段,矩形,圆,椭圆,多边形,文字
      • 鼠标事件
      • 获取和修改图像像素,获取图像类型,ROI,图像通道拆分合并,图像融合
      • 图像缩放,平移,旋转,仿射变换,透视变换

参考书籍:opencv 4.1中文官方文档v1.1版.pdf
网站:http://www.woshicver.com/

书中一些参考学习:
Python快速指南- [一小部分Python]:http://swaroopch.com/notes/python/
基本的Numpy教程:http://wiki.scipy.org/Tentative_NumPy_Tutorial
numpy示例列表:http://wiki.scipy.org/Numpy_Example_List
OpenCV文档:http://docs.opencv.org/
OpenCV论坛:http://answers.opencv.org/questions/

读取和显示文件

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

# 读取和显示图像
imgpath = r'D:\dell\picture\lena.png'

# cv.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。
# cv.IMREAD_GRAYSCALE:以灰度模式加载图像
# cv.IMREAD_UNCHANGED:加载图像,包括alpha通道
# 注意 除了这三个标志,你可以分别简单地传递整数1、0或-1。
img = cv.imread(imgpath,cv.IMREAD_GRAYSCALE) #0表示加载灰度图像

showWay = 1
#opencv显示图像
if showWay == 0:
    # 默认情况下,该标志为cv.WINDOW_AUTOSIZE,如果将标志指定为**cv.WINDOW_NORMAL**,则可以调整窗口大小
    cv.namedWindow('image',cv.WINDOW_NORMAL)
    cv.imshow('image',img)
    resKey = cv.waitKey(0) & 0xFF
    print('reskey:',resKey)
    if resKey == 27: # 等待ESC退出
        cv.destroyAllWindows()
    elif resKey == ord('s'): # 等待关键字,保存和退出
        cv.imwrite('lenagray.png',img) #写入图像
        cv.destroyAllWindows()
    ## 随便点某一个按键都会结束,不知道为啥
#Matplotlib显示图像
elif showWay == 1:
    #OpenCV加载的彩色图像处于BGR模式。但是Matplotlib以RGB模式显示。因此,如果使用OpenCV读取彩色图像,则Matplotlib中将无法正确显示彩色图像
    plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
    plt.xticks([]), plt.yticks([]) # 隐藏 x 轴和 y 轴上的刻度值
    plt.show()

Matplotlib绘图样式和功能:http://matplotlib.org/api/pyplot_api.html
当你尝试在OpenCV中加载彩色图像并将其显示在Matplotlib中时,存在一些问题。阅读此讨论:http://stackoverflow.com/a/15074748/1134940)并理解它。

绘制线段,矩形,圆,椭圆,多边形,文字

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

# 读取和显示图像
imgpath = r'D:\dell\picture\lena.png' 
img = cv.imread(imgpath)
imgSize = img.shape #获取图片高宽,此图为(578, 457) 
#图像左上角为(0,0)

# 绘制一条宽度为5的蓝色对角线,(255,0,0)为BGR
cv.line(img,(0,0),(50,50),(255,0,0),5)
# 绘制一个绿色的宽度为3的矩形
cv.rectangle(img,(0,0),(80,80),(0,255,0),3)
# 绘制一个圆,-1表示填充圆
cv.circle(img, (110,110), 20, (0,0,255), -1)
# 绘制椭圆,参数依次为中心位置,(长轴长度,短轴长度),沿逆时针方向旋转的角度,startAngle和endAngle表示从主轴沿顺时针方向测量的椭圆弧的开始和结束。
cv.ellipse(img,(250,400),(100,50),30,0,180,(0,255,255),-1)
# 绘制多边形
pts = np.array([[10,10],[100,20],[160,100],[20,80]], np.int32)
pts = pts.reshape((-1,1,2))
#如果第三个参数为False,您将获得一条连接所有点的折线,而不是闭合形状
cv.polylines(img,[pts],True,(255,0,255))
#像图像添加文本
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV-Python',(100,420), font, 1,(0,0,0),2,cv.LINE_AA)

cv.imshow('image',img)
resKey = cv.waitKey(0)
cv.destroyAllWindows()

结果:
在这里插入图片描述

鼠标事件

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

drawing = False # 如果按下鼠标,则为真
mode = True # 如果为真,绘制矩形。按 m 键可以切换到曲线
ix,iy = -1,-1

# 鼠标回调函数
def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,mode
    if event == cv.EVENT_LBUTTONDOWN:
        drawing = True
        ix,iy = x,y
    elif event == cv.EVENT_MOUSEMOVE:
        if drawing == True:
            if mode == True:
                cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
            else:
                cv.circle(img,(x,y),3,(255,0,0),-1)
    elif event == cv.EVENT_LBUTTONUP:
        drawing = False
        if mode == True:
            cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
        else:
            cv.circle(img,(x,y),10,(0,0,255),-1)

# 读取和显示图像
imgpath = r'D:\dell\picture\lena.png' 
img = cv.imread(imgpath)

cv.namedWindow('image')
#绑定鼠标回调事件
cv.setMouseCallback('image',draw_circle)

while(1):
    cv.imshow('image',img)
    resKey = cv.waitKey(20) & 0xFF
    if resKey == 27:
        break
    elif resKey == ord('m'):
        mode = not mode
cv.destroyAllWindows()

效果显示:
在这里插入图片描述

获取和修改图像像素,获取图像类型,ROI,图像通道拆分合并,图像融合


import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

cv.namedWindow('image')
imgpath = r'D:\dell\picture\lena.png' 
imgpath2 = r'D:\dell\picture\unknow.png' 
img = cv.imread(imgpath)
img2 = cv.imread(imgpath2)

#获取图像行,列和通道数的元组
print(img.shape) #返回 (578, 457, 3)
#访问图像像素
# pixelInfo = img[100,100]  #BGR [229 227 230]
pixelInfo = img.item(100,100,2)  #红色通道
print(pixelInfo)  
#修改像素
# img[100,100] = [0,0,0]
img.itemset((100,100,2),10)
#像素总数
print( img.size )  #792438  = 578*457*3
#图像数据类型
print( img.dtype ) #uint8
#获取图像感兴趣的ROI
partImg = img[50:350,10:400]
#将BGR图像拆分为单个通道
# b = img [:, :, 0]
b,g,r = cv.split(partImg)  #是一项耗时的操作
#合并rgb
mergeImg = cv.merge((b,g,r))
#显示ROI图像
# cv.imshow('image',partImg)
# resKey = cv.waitKey(0) & 0xFF
# cv.destroyAllWindows()

# 图像边框设置
# replicate = cv.copyMakeBorder(partImg,10,10,10,10,cv.BORDER_REPLICATE)
# reflect = cv.copyMakeBorder(partImg,10,10,10,10,cv.BORDER_REFLECT)
# reflect101 = cv.copyMakeBorder(partImg,10,10,10,10,cv.BORDER_REFLECT_101)
# wrap = cv.copyMakeBorder(partImg,10,10,10,10,cv.BORDER_WRAP)
# constant= cv.copyMakeBorder(mergeImg,10,10,10,10,cv.BORDER_CONSTANT,value=[255,0,0])
# # matplotlib显示时图像BGR变为RGB,这里没处理
# plt.subplot(231),plt.imshow(mergeImg,'gray'),plt.title('ORIGINAL')
# plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
# plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
# plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
# plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
# plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
# plt.show()

#图像融合
#计算图像操作耗时
e1 = cv.getTickCount()
dst = cv.addWeighted(img,0.7,img2,0.3,0)
e2 = cv.getTickCount()
t = (e2 - e1)/cv.getTickFrequency()
print( t )
# 检查是否启用了优化 ,  关闭它cv.setUseOptimized(False)
print(cv.useOptimized())

cv.imshow('image',dst)
resKey = cv.waitKey(0) & 0xFF
cv.destroyAllWindows()

效果:
在这里插入图片描述

图像缩放,平移,旋转,仿射变换,透视变换


import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

imgpath = r'D:\dell\picture\lena.png' 
imgpath2 = r'D:\dell\picture\unknow.png' 
img = cv.imread(imgpath)
img2 = cv.imread(imgpath2)
#图像变换--**cv.warpAffine**采用2x3转换矩阵,而**cv.warpPerspective**采用3x3转换矩阵作为输入。
#图像缩放 -- 注意里面fx,fy为int类型
res = cv.resize(img,None,fx=2, fy=2, interpolation = cv.INTER_CUBIC)
#或者
height, width = img.shape[:2]
res = cv.resize(img,(2*width, 2*height), interpolation = cv.INTER_CUBIC)

#平移
M = np.float32([[1,0,100],[0,1,50]])
dst = cv.warpAffine(img,M,(width,height))

#旋转
# cols-1 和 rows-1 是坐标限制,参数依次为旋转中心,旋转角度,缩放系数
M = cv.getRotationMatrix2D(((width-1)/2.0,(height-1)/2.0),90,1)
dst = cv.warpAffine(img,M,(width,height))

# cv.namedWindow('image')
# cv.imshow('image',dst)
# resKey = cv.waitKey(0) & 0xFF
# cv.destroyAllWindows()

#仿射变换
rows,cols,ch = img.shape
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv.getAffineTransform(pts1,pts2)
dst = cv.warpAffine(img,M,(cols,rows))
# plt.subplot(121),plt.imshow(img),plt.title('Input')
# plt.subplot(122),plt.imshow(dst),plt.title('Output')
# plt.show()

#透视变换
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv.getPerspectiveTransform(pts1,pts2)
dst = cv.warpPerspective(img,M,(300,300))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

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

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

相关文章

社科院杜兰金融管理硕士——考研初试成绩已出,关于分数“6线”你有了解吗

多地公布了2023考研初试成绩查询时间,部分省份今日就能查询到考研初试成绩,考研学子们此刻的心情应该是很忐忑吧,关于分数的“6线”你都知道有哪些吗?我们跟随社科院杜兰金融管理硕士项目一起去了解一下。1.国家线教育部依据硕士生…

骨传导耳机工作原理,骨传导耳机优缺点

骨传导耳机虽说最近是十分火爆的一款单品,但还是有很多人对骨传导耳机不是很了解,骨传导耳机更多使用场景还是在户外运动使用,骨传导耳机对于长时间使用耳机的人来说十分友好,这主要还是得益于骨传导耳机传输声音的特殊性。 下面我…

《Vue+Spring Boot前后端分离开发实战》专著累计发行上万册

杰哥的学术专著《VueSpring Boot前后端分离开发实战》由清华大学出版社于2021年3月首次出版发行,虽受疫情影响但热度不减,受到业界读者的热捧,截至今日加印5次,累计发行12000册,引领读者开发前后端分离项目&#xff0c…

Temperature_Drift_Test_Tool使用说明

测试目的: 测试各个厂商的电阻温漂是否满足使用要求。 测试方法: 1、取5~10个电阻样品。 2、测试样品初始值,并保存文件。 3、设定测试流程。 4、开始测试,实时分析测试结果。 5、导出测试数据,并进一步分析。 6、得…

【Kubernetes 企业项目实战】08、简化 K8s 应用部署工具 Helm V3 入门到企业实战

目录 一、Helm 介绍 1.1 Helm 是什么 1.2 Helm 解决了什么痛点 1.3 Helm 相关组件及概念 1.4 Helm v3 版本变化 1.5 总结 二、安装 Helm 2.1 下载 Helm 2.2 安装 Helm 2.3 配置国内存放 chart 仓库的地址 三、Helm 基本使用 3.1 搜索和下载 Chart 3.2 部署 chart …

用Python搓一个黑洞

文章目录简介单位制观测绘图简介 黑洞图像大家都知道,毕竟前几年刚发布的时候曾火遍全网,甚至都做成表情包了。 问题在于,凭什么认为这就是黑洞的照片,而不是一个甜甜圈啥的给整模糊了得到的呢?有什么理论依据吗&…

动态规划-01背包

理论 有N件物品和⼀个最多能被重量为W 的背包。第i件物品的重量是weight[i],得到的价值是 value[i] 。每件物品只能⽤⼀次,求解将哪些物品装⼊背包⾥物品价值总和最⼤。 思路 确定dp数组的定义 在⼀维dp数组中,dp[j]表⽰:容量为…

【C++算法】dfs深度优先搜索(下) ——【全面深度剖析+经典例题展示】

💃🏼 本人简介:男 👶🏼 年龄:18 🤞 作者:那就叫我亮亮叭 📕 专栏:关于C/C那点破事 文章目录0.0 写在前面1. 中国象棋1.1 题干信息① 背景说明概述② 问题描述…

【2月比赛合集】55场可报名的数据挖掘奖金赛,任君挑选!

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号同时会推送最新的比赛消息,欢迎关注!更多比赛信息见 CompHub主页 或 点击文末阅读原文以下信息仅供参考,以比赛官网为准目录Kaggle&#xff…

C++学习笔记-循环

C循环语句包括while语句,do-while语句和for语句等常见几种语句。while语句实现"当型"循环,do-while语句实现"直到型"循环,for语句也用来实现"当型"循环。 有的时候,可能需要多次执行同一块代码。一…

如何锁定Word文档部分文字不被修改

我们知道,想要保护Word文档的内容无法随意更改,可以设置“限制编辑”的保护模式。 那如果实际工作中,只需要固定的一部分内容不能编辑,可以实现吗?答案是肯定的,今天就来说说如何设置Word文档部分文字可修…

Unity UI框架

一、简介 最近在各大网站看了一下 Unity3d 的 UI 框架,各种 UI 框架已经有很多的版本了,各有千秋,有的功能虽然写的完善,但用起来太复杂,有的框架功能不完善,搞个课程就上架了,还有什么 MVC 框…

linux服务器+宝塔从头教你部署vue+springboot项目

前言 如果从没进行过将自己的个人项目部署到服务器的话,想要能够部署项目成功并且让别人访问到自己的项目还是比较难的。再加上我查找搜索别人的教程,要么就是互相复制抄步骤,要么就是不全,或者部署过程不明确,让人很…

Mybatis的介绍和基本使用

目录 数据库操作框架的历程 JDBC Hibernate JDBCTemplate 什么是Mybatis 快速搭建Mybatis项目 创建普通的maven项目 导入相关的依赖 创建对应的数据表 创建与表对应的实体类对象 创建对应的Mapper接口 编写配置文件 编写测试类 增删改查的基本操作 数据库操作框…

魔兽世界服务端端新手搭建教程

明杰也是很久以前开始研究魔兽服务器架设,主要原因是亚服经常要排队6-7个小时,去不排除的服和单机没啥区别,以怀旧服玩到10级以后就开始玩335端,一开始也和新入手的人一样云里雾里的,经过长时间的学习总算有点成就,向新…

三次握手四次挥手详细解析面试常问

文章目录1.第2次握手传回了ACK,为什么还要传回SYN?2.断开连接-TCP 四次挥手3.为什么要四次挥手?4.为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?5.如果第二次挥手时服务器的 ACK 没有送达客户端&#x…

从零实现深度学习框架:Seq2Seq从理论到实战【理论篇】

来源:投稿 作者:175 编辑:学姐 往期内容: 从零实现深度学习框架1:RNN从理论到实战(理论篇) 从零实现深度学习框架2:RNN从理论到实战(实战篇) 从零实现深度…

RabbitMQ之Work Queues

Work Queues 工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务…

Spring:五、编程式事务

Spring:五、编程式事务 1 前言 spring支持声明式和编程式事务,因spring事务基于AOP,使用cglib作为代理,为父子类继承的代理模式,故而声明式事务Transactional中,常见事务失效的场景,如方法内自…

基于UIAutomation+Python+Unittest+Beautifulreport的WindowsGUI自动化测试框架common目录解析

文章目录1 框架工具说明2 技术栈说明3 框架截图4 源码解析/common目录4.1 common/baseinfo.py4.2 common/creenShot.py4.3 common/logOut.py4.4 common/reportOut.py4.5 common/sendMail.py注: 1、本文为本站首发,他用请联系作者并注明出处,谢…