opencv实战--角度测量和二维码条形码识别

文章目录

  • 前言
  • 一、鼠标点击的角度测量
  • 二、二维码条形码识别


前言

这里是引用


一、鼠标点击的角度测量

首先导入一个带有角度的照片
在这里插入图片描述
然后下面的代码注册了一个鼠标按下的回调函数,
还有一个点的数列,鼠标事件为按下的时候就记录点,并画出点,由于点是画在图像上面的,那么就要求了img是需要刷新的所以将他们放在while True里面
当有按键按下的的时候就把图片归为原来的以及清除列表的值。

按键的使用可以看这个文章
简述

cv2.waitKey(1)在有按键按下的时候返回按键的ASCII值,否则返回-1
& 0xFF的按位与操作只取cv2.waitKey(1)返回值最后八位,因为有些系统cv2.waitKey(1)的返回值不止八位
ord(‘q’)表示q的ASCII值
总体效果:按下q键后break

import cv2
import mathimg = cv2.imread('jiaodu.png')
pointslist = []def mousepoints(event,x,y,flags,params):if event == cv2.EVENT_LBUTTONDOWN:cv2.circle(img,(x,y),5,(0,0,255),cv2.FILLED)pointslist.append([x,y])print(pointslist)
while True:cv2.imshow('image',img)cv2.setMouseCallback('image',mousepoints)keycc = cv2.waitKey(1) & 0xFFif keycc == ord('q'):pointslist = []img = cv2.imread('jiaodu.png')if keycc == ord('c'):exit()

当在图像上点击的时候有红点,当按下q的时候清除,当按下c的时候退出
接着我们要做的就是每点击一下就会出现三角的边,我们用size来做判断,当取余后值为2的时候就说明要画一个直线,当按下第三个点的时候要是第二条直线,那么就elif size % 3 == 0 and size != 0:
就可以得到啦
还是用了tuple()函数因为 cv2.line 需要点的坐标作为元组,所以我们使用 tuple 函数将列表转换为元组。
使用到了画线函数cv2.line可以参考这篇文章
简述:

cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) → img
img,背景图
pt1,直线起点坐标
pt2,直线终点坐标
color,当前绘画的颜色。如在BGR模式下,传递(255,0,0)表示蓝色画笔。灰度图下,只需要传递亮度值即可。
thickness,画笔的粗细,线宽。若是-1表示画封闭图像,如填充的圆。默认值是1.
lineType,线条的类型,
如8-connected类型、anti-aliased线条(反锯齿),默认情况下是8-connected样式ide,cv2.LINE_AA表示反锯齿线条,在曲线的时候视觉效果更佳。

def mousepoints(event,x,y,flags,params):if event == cv2.EVENT_LBUTTONDOWN:cv2.circle(img,(x,y),5,(0,0,255),cv2.FILLED)pointslist.append([x,y])size = len(pointslist)if size % 3 == 2:cv2.line(img, tuple(pointslist[-2]), tuple(pointslist[-1]), (255, 0, 0), 2)# 当添加第三个点时,使用第一个点和第三个点绘制线elif size % 3 == 0 and size != 0:cv2.line(img, tuple(pointslist[-3]), tuple(pointslist[-1]), (255, 0, 0), 2)print(pointslist)

在这里插入图片描述
现在我们还需要计算出,直接使用math中的函数,不过,我们需要由梯度来求,具体公式百度,最终的代码:

import cv2
import mathimg = cv2.imread('jiaodu.png')
pointslist = []def mousepoints(event,x,y,flags,params):if event == cv2.EVENT_LBUTTONDOWN:cv2.circle(img,(x,y),5,(0,0,255),cv2.FILLED)pointslist.append([x,y])size = len(pointslist)if size % 3 == 2:cv2.line(img, tuple(pointslist[-2]), tuple(pointslist[-1]), (255, 0, 0), 2)# 当添加第三个点时,使用第一个点和第三个点绘制线elif size % 3 == 0 and size != 0:cv2.line(img, tuple(pointslist[-3]), tuple(pointslist[-1]), (255, 0, 0), 2)print(pointslist)def gradient(pt1,pt2):return (pt2[1]-pt1[1])/(pt2[0]-pt1[0])def getAngle(pointslist):pt1,pt2,pt3 = pointslist[-3:]m1 = gradient(pt1,pt2)m2 = gradient(pt1,pt3)angr = math.atan((m2 - m1)/(1+(m1 * m2)))angd = round(math.degrees(angr))cv2.putText(img,str(angd),(pt1[0]-40,pt1[1]),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),1)print(angd)while True:if len(pointslist) % 3 == 0 and len(pointslist) != 0:getAngle(pointslist)cv2.imshow('image',img)cv2.setMouseCallback('image',mousepoints)keycc = cv2.waitKey(1) & 0xFFif keycc == ord('q') or keycc == ord('Q') :pointslist = []img = cv2.imread('jiaodu.png')if keycc == ord('c') or keycc == ord('C') :exit()

二、二维码条形码识别

需要安装库numpypyzbar
numpy是anaconda自带的,我们在终端输入 pip install pyzbar就可以进行下载了。
我们首先有一张有二维码的图片在这里插入图片描述

import cv2
import numpy as np
from pyzbar.pyzbar import decodeimg = cv2.imread('qr.png')code = decode(img)
print(code)

我们可以读取到图片中二维码的信息

[Decoded(data=b’111111’, type=‘QRCODE’, rect=Rect(left=182, top=381,
width=163, height=164), polygon=[Point(x=182, y=381), Point(x=182, y=545), Point(x=345, y=545), Point(x=345, y=381)], quality=1, orie ntation=‘UP’)]

其中data就是我们要的数据,而polygon是边框点
我们只打印出二维码的数据信息

import cv2
import numpy as np
from pyzbar.pyzbar import decodeimg = cv2.imread('qr.png')for barcode in decode(img):print(barcode.data)

在这里插入图片描述
其中的b是编码

import cv2
import numpy as np
from pyzbar.pyzbar import decodeimg = cv2.imread('qr.png')for barcode in decode(img):mydata = barcode.data.decode('utf-8')print(mydata)

这样就可以只得到数据信息。
现在我们调用摄像头cv2.VideoCapture(0)还需要在二维码周围画框cv2.polylines,在周围显示 cv2.putText二维码的数据。

NumPy 和 OpenCV 的用法。
np.array(): NumPy 的 array 函数用于创建一个数组。在这里,barcode.polygon 被转换成一个 NumPy 数组。
[barcode.polygon]: 这个语法是创建一个包含 barcode.polygon 的列表。这在创建二维或者更高维度的数组时是常见的做法。
np.int32: 这是一个参数,指定了新创建的数组的数据类型应该是 32 位整数。在图像处理中,像素的坐标通常是整数。
pts: 这是一个变量,用于保存新创建的数组。
所以,pts = np.array([barcode.polygon], np.int32) 这句话的作用是创建一个新的 NumPy 数组,数组的元素来自 barcode.polygon,并且这个数组的数据类型是 32 位整数。这通常用于处理图像,比如 OpenCV 的多边形(如轮廓等)。

import cv2
import numpy as np
from pyzbar.pyzbar import decodecap = cv2.VideoCapture(0)while True:success,img = cap.read()# img = cv2.imread('qr.png')for barcode in decode(img):mydata = barcode.data.decode('utf-8')print(mydata)pts = np.array([barcode.polygon],np.int32)pts = pts.reshape((-1,1,2))cv2.polylines(img,[pts],True,(255,0,255),5)pts2 = barcode.rectcv2.putText(img,mydata,(pts2[0],pts2[1]),cv2.FONT_HERSHEY_SIMPLEX,0.9,(255,0,255),2)cv2.imshow('result',img)keycc = cv2.waitKey(1)if keycc == ord('c') or keycc == ord('C') :exit()

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

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

相关文章

【软件测试】Git 远程仓库的使用(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 查看远程仓库 想…

SQL性能规范

一、随聊 记录一下吧,2023年7月13日00:11:11,现在的状态真的很,忙,干不完的活,希望巨大的压力,能够让自己快速成长,回想我这一路,21年大专毕业,用一年时间熟悉软件&…

STM32 Proteus仿真医用仓库环境控制系统紫外线消毒RS232上传CO2 -0066

STM32 Proteus仿真医用仓库环境控制系统紫外线消毒RS232上传CO2 -0066 Proteus仿真小实验: STM32 Proteus仿真医用仓库环境控制系统紫外线消毒RS232上传CO2 -0066 功能: 硬件组成:STM32F103R6单片机 LCD1602显示器DHT11温度湿度电位器模拟…

golang中的【数组】相关知识点

目录 数组含义数组定义形式数组的声明初始化方式数组变量的类型 arr的特征数组的遍历遍历的用法二数组的值传递数组的引用&取地址 传送二维数组的相关操作定义二维数组初始化遍历 Golang是一种高效的编程语言,具有很多特性和优点,其中之一就是其对数…

RNN、LSTM、Seq2Seq

目录 时间序列表示梯度弥散和梯度爆炸RNN(循环神经网络)LSTMSeq2SeqELMo 时间序列表示 核心是加入历史信息去预测下一步骤 在NLP中,序列维度一般是这个样子:[b,seq_len,feature_len] b个句子,每个句子seq_len个单词,…

【复习10-12天内容】【我们一起60天准备考研算法面试(大全)-第十四天 14/60】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

OK3588运行python程序对摄像头数据进行图像处理

OK3588运行python程序读取usb摄像头 硬件连接用工具测试验证摄像头工作正常python 读取usb摄像头并进行图像处理 硬件连接 把usb摄像头插入HOST的usb接口。 在串口终端运行 sudo v4l2-ctl --list-devices 如下图 当前的usb设备是 /dev/video74 用工具测试验证摄像头工作正常…

贪心算法、贪心搜索/采样(greedy search/sampling)、集束搜索(beam search)、随机采样(random sample)

首先需要了解贪心算法: 贪心算法,又名贪婪法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好/最优的选择(局部最有利的选…

Android之Intent

意图介绍 一个意图(Intent)对象包含了目标组件、动作、数据、类别、附加数据、标志六个部分。 目标组件 目标组件可以帮助应用发送显式意图调用请求。在创建Intent时,可以通过setComponent方法来设置一个组件,如: //设置组件 intent.setC…

LRU 缓存

题目链接 LRU 缓存 题目描述 注意点 如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字函数 get 和 put 必须以 O(1) 的平均时间复杂度运行 解答思路 如果想以O(1)的速度进行get,则需要将对应的key、value存到map中如果想…

​ 基于单片机智能温室大棚控制系统

功能介绍 以51单片机作为主控系统; DS18B20温度采集模块检测温度; 光敏电阻和ADC0832组成的光照检测模块; 土壤湿度检测模块检测土壤湿度; CO2检测模块检测CO2浓度; LCD1602显示模块显示测量值、 若温度小于温度最…

【2023江西省研究生数学建模竞赛】第三题 植物的多样性 48页论文及Python代码

【2023江西省研究生数学建模竞赛】第三题 植物的多样性 48页论文及Python代码 相关链接 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 【2…

车道线检测|利用边缘检测的原理对车道线图片进行识别

前言 那么这里博主先安利一些干货满满的专栏了! 这两个都是博主在学习Linux操作系统过程中的记录,希望对大家的学习有帮助! 操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482Linux S…

【深度学习】受限玻尔兹曼机 (RBM) 初学者指南

一、说明 受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)是一种基于能量模型的人工神经网络。它只有一个隐层,将输入层和隐层中的每个神经元互相连接,但不同层的神经元之间没有连接。RBM是一种无向的概率图模型&am…

一套完全开源,支持多租户,界面配置单点的后端框架JVS

JVS的多租户体系统 在IT系统中,“租户”(tenant)通常用于指代一种多租户架构(multi-tenancy),它是一种软件架构模式,允许多个用户或组织共享相同的应用程序或系统实例,但彼此之间的…

7.5 SpringBoot 拦截器Interceptor实战 统一角色权限校验

文章目录 前言一、定义注解annotation二、拦截角色注解1. 在拦截器哪里拦截?2. 如何拦截角色注解?3. 角色如何读取?4. 最后做角色校验 三、应用:给管理员操作接口加注解四、PostMan测试最后 前言 在【7.1】管理员图书录入和修改API&#xf…

JMeter 中 3 种参数值的传递

目录 前言: (一) 从 CSV 文件读取要批量输入的变量 (二) 利用 Cookie 进行值的传递 (三) 利用正则匹配提取上一个接口的返回数据作为下个请求的输入 前言: 在JMeter中,参数值的传递是非常重要的,因为它允许你在测试过程中动态…

右键pdf文件没有打印

问题描述 右键点pdf文件,弹出的菜单找不到打印选项。网上找了很多办法,然并卵啊。还是得靠自己慢慢摸索。 原因分析 新安装的win11系统,pdf文件默认可以用windows自带的edge浏览器打开。但是edge浏览器没有能力提供右键打印功能。 解决办法…

详解LeafLet中如何展示GeoServer发布的图层组

目录 前言 一、关于图层组 1、使用图层图组的好处 2、创建图层组 二、在Leaflet中展示图层组 1、新建Html模板框架 2、绑定地图map和底图设置 3、绑定图层组 总结 前言 在之前的博文中,曾经重点介绍如何使用LeafLet叠加Geoserver wms图层到已有底图的方法 ,…

Python应用:什么是爬虫?

文章目录 什么是爬虫虫之初,性本善?出行社交电商搜索引擎政府部门总结 面向监狱编程爬虫的君子协议什么是君子协议君子协议是怎么产生的?君子协议是什么内容?如何查看一个网站的robots协议违反君子协议的案例 参考文献 2022年初的…