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 math

img = 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) & 0xFF
    if 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 math

img = 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) & 0xFF
    if 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 decode

img = 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 decode

img = cv2.imread('qr.png')

for barcode in decode(img):
    print(barcode.data)

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

import cv2
import numpy as np
from pyzbar.pyzbar import decode

img = 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 decode

cap = 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.rect
        cv2.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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp左右滑动切换月份

左右滑动触发事件 给组件绑定事件,主要利用组件的触摸开始和触摸结束事件来实现: <view @touchstart="touchStart" @touchend="touchEnd"> 2,声明初始化点击位置变量startX data() {return {list:[],pageNum:1,pageSize:10,//初始化点击位置…

css之:is()、:where()和:has()伪元素的运用、使用、important

文章目录 简介1、:is()2、:where()3、:has() 简介 :is()、:where()和:has()伪元素是CSS中用于样式化元素的非常强大的工具。它们是在CSS选择器Level4规范中引入的。它们允许我们将样式应用于符合特定条件的任何元素&#xff0c;例如元素的类型、元素的位置和元素的后代。 1、:i…

【C#】并行编程实战:实现数据并行(4)

本章继续学习实现数据并行&#xff0c;本文主要介绍并行循环中的线程存储。这也是本章节的最后一篇。 本教程对应学习工程&#xff1a;魔术师Dix / HandsOnParallelProgramming GitCode 5、了解并行循环中的线程存储 默认情况下&#xff0c;所有并行循环都可以访问全局…

香橙派4和树莓派4B构建K8S集群实践之八: TiDB

目录 1. 说明 2. 准备工作 3. 安装 3.1 参考Tidb官方 v1.5安装说明 3.2 准备存储类 3.3 创建crd 3.4 执行operator 3.5 创建cluster/dashboard/monitor容器组 3.6 设置访问入口(Ingress & Port) 4. 装好后的容器状况 5. 遇到的问题 6. 参考 1. 说明 建立TiDB…

全志F1C200S嵌入式驱动开发(串口驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 对于uboot、kernel和rootfs来说,他们的串口输出一般都是uart0。一般这么做,是没有问题的。只不过我们自己买的这块f1c200s电路板,设计者把uart转ttl的接口,改接到了uart1上面。…

微信小程序下拉选择

微信小程序中下拉框选择一般的交互方式有以下两种 直接下拉选择点击选择框后&#xff0c;弹出浮层进行选择 下边分别介绍两种方式的实现。在微信小程序中&#xff0c;这两种实现都需要修改三个文件 js 文件&#xff1a;下拉选择逻辑的具体实现 wxml 文件&#xff1a;下拉组件…

1、linux中安装tomcat

1、创建目录 cd /opt ls mkdir tomcat 2、将文件拖入tomcat目录中 3、解压安装包 cd /opt/tomcat ls tar -zxvf apache-tomcat-8.5.59.tar.gz 4、启动tomcat cd /opt/tomcat/apache-tomcat-8.5.59/bin ./startup.sh 5、在linux中访问 http://localhost:8080/ 6、开放端口 …

生成式AI管理规则落地 大模型后时代到来

国家网信办等七部门联合颁布的《生成式人工智能服务管理暂行办法》&#xff0c;给中国生成式AI产业树立了发展规范。 这份监管文件的用意并不止于管控&#xff0c;还用大量的笔墨传递出推动产业发展的原则&#xff0c;尤其强调“鼓励生成式人工智能技术在各行业、各领域的创新…

基于springboot,vue网上订餐系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术 &#xff1a;VueElementUI 服务端技术&#xff1a;springbootmybatisredis 本系统分用户前台和管理后台两部分&#xff0c;项…

Docker(三)之容器管理工具 Docker生态架构及部署

容器管理工具Docker生态架构及部署 一、Docker生态架构 1.1 Docker Containers Are Everywhere 1.2 生态架构 1.2.1 Docker Host 用于安装Docker daemon的主机&#xff0c;即为Docker Host&#xff0c;并且该主机中可基于容器镜像运行容器。 1.2.2 Docker daemon 用于管理…

ASP.NET Website 项目 .NET Framework 4.0 ~ .NET Framework 4.8支持c#哪些版本(Website)

本文讲的是Website网站项目&#xff0c;由于维护老项目Website .net framework4.0&#xff0c;遇到c#6.0语法不支持。便做了点记录 ASP.NET Website 项目 .NET Framework 4.0、 .NET Framework 4.5、 .NET Framework 4.6、 .NET Framework 4.8都支持c#哪些版本&#xff1f; 下面…

【SQL】Your password has expired. To log in you must change it.......

在配置SQL的编辑器的时候&#xff0c;连接过程出现了如下的错误&#xff1a; Your password has expired. To log in you must change it using a client that supports expired passwords.当连接到 SQL 时&#xff0c;如果出现 “Your password has expired. To log in you m…

SpringBoot+React学科竞赛管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootReact框架开发的学科竞赛管理系统。首先&#xff0c;这是一个前后端分离的项目&#xff0c;代码简洁…

Mars3d采用ellipsoid球实现模拟地球旋转效果

1.Mars3d采用ellipsoid球实现模拟地球旋转效果 2.开始自选装之后&#xff0c;模型一直闪烁 http://mars3d.cn/editor-vue.html?idgraphic/entity/ellipsoid 3.相关代码&#xff1a; import * as mars3d from "mars3d"export let map // mars3d.Map三维地图对象 …

MATLAB | 爱心图例与精致半透明圆角图例

本文中全部示意图均为本人自制&#xff0c;传播时请注明出处。 写了点小成品函数&#xff0c;比如如何绘制饼图时把图例上的图标变成心形&#xff1a; 比如如何自制半透明圆角图例&#xff1a; 依旧先讲原理再给出这俩代码哈&#xff1a; 1 原理讲解-图形对象 封闭四边形对…

Vue项目搭建过程

Vue项目搭建过程 1、安装NodeJs 1.1 下载安装包 在 http://nodejs.cn/download/ 上下载64位安装包&#xff0c;然后进行安装&#xff0c;和普通软件的安装一样。 C:\Users\Administrator>node -v v16.13.1C:\Users\Administrator>npm -v 8.5.51.2 安装cnpm # 安装cn…

DNS 是如何影响你冲浪速度的?

本文详细介绍了 DNS 相关知识&#xff0c;包括 DNS 工作原理、如何提升域名解析速度、以及 DNS 记录与报文等内容。 1. 域名与域名服务器 在日常上网过程中&#xff0c;出于好记的原因&#xff0c;人们更喜欢在浏览器中输入网站的域名&#xff0c;而不是 IP 地址。比如想要访问…

CV常用注意力机制总结

本文总结了近几年CV领域常用的注意力机制&#xff0c;包括&#xff1a;SE&#xff08;Squeeze and Excitation&#xff09;、ECA&#xff08;Efficient Channel Attention&#xff09;、CBAM&#xff08;Convolutional Block Attention Module&#xff09;、CA&#xff08;Coor…

切换.net Framework 版本后,出现NuGet 包是使用不同于当前目标框架的目标框架安装的,可能需要重新安装

问题现象&#xff1a; 由于添加新的dll文件&#xff0c;依赖的.NET Framework版本与当前的不一致&#xff0c;在vs 中切换了目标框架版本后&#xff0c;运行程序&#xff0c;出现以下的warnning信息&#xff1a; 一些 NuGet 包是使用不同于当前目标框架的目标框架安装的&#…

MacOS系统(M1/M2)安装AI绘画StableDiffusion保姆级教程

TOC 安装完成后&#xff0c;推荐阅读这篇教程&#xff1a;AI绘画&#xff1a;Stable Diffusion 终极炼丹宝典&#xff1a;从入门到精通 实操环境&#xff1a; macOS 13 Arm64&#xff08;建议12以上的系统使用&#xff09; Apple M1 先来看几个样例&#xff1a; AI绘画S…