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

这篇具有很好参考价值的文章主要介绍了opencv实战--角度测量和二维码条形码识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

opencv实战--角度测量和二维码条形码识别,opencv,python,人工智能


一、鼠标点击的角度测量

首先导入一个带有角度的照片
opencv实战--角度测量和二维码条形码识别,opencv,python,人工智能
然后下面的代码注册了一个鼠标按下的回调函数,
还有一个点的数列,鼠标事件为按下的时候就记录点,并画出点,由于点是画在图像上面的,那么就要求了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)

opencv实战--角度测量和二维码条形码识别,opencv,python,人工智能
现在我们还需要计算出,直接使用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就可以进行下载了。
我们首先有一张有二维码的图片opencv实战--角度测量和二维码条形码识别,opencv,python,人工智能

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)

opencv实战--角度测量和二维码条形码识别,opencv,python,人工智能
其中的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 的多边形(如轮廓等)。文章来源地址https://www.toymoban.com/news/detail-572730.html

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()

到了这里,关于opencv实战--角度测量和二维码条形码识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv快速实现任意角度二维码矫正

    那天听到领导他们在讨论,说要将图片进行个矫正处理,还叫来了算法部的大佬来讨论将要如何处理这个,讨论场面很是激烈 不得不说好奇心是个很神奇的东西,就把我给吸引过去了 我定眼一看,感觉作为JAVA开发的我自己也能进行处理 因为看到了图片后,发现了图片中一个

    2024年02月05日
    浏览(58)
  • H5实现扫码读取二维码条形码功能(二维码+条形码)

    本文主要介绍二维码实现的原理 1、使用插件 npm install @zxing/library 2、主要用到 BrowserMultiFormatReader 这个构造函数,用于打开摄像头 视图 核心代码(以vue3写法举例) 二维码的样式 ``

    2024年02月11日
    浏览(46)
  • 【Android】实现生成二维码、条形码和扫描二维码的功能

    目录 一、添加依赖 二、布局文件 三、实现生成二维码的功能 四、效果图 要先添加一个第三方库来实现二维码的生成以及扫描二维码的功能,开源库如下: 在build.grade(Moudle)中添加依赖: 效果如下: activity_main.xml: MainActivity.java: 简单粗暴! 感谢ლ(°◕‵ƹ′◕ლ)!!!

    2024年02月11日
    浏览(58)
  • 【MAUI】条形码,二维码扫描功能

    本系列文章面向移动开发小白,从零开始进行平台相关功能开发,演示如何参考平台的官方文档使用MAUI技术来开发相应功能。 移动端的扫描条形码、二维码的功能已经随处可见,已经很难找到一个不支持扫描的App了,但是微软的MAUI竟然没有提供,那么我们应该如何实现呢?

    2024年02月04日
    浏览(33)
  • java生成、识别条形码和二维码

    使用 zxing 开源库 Zxing主要是Google出品的,用于识别一维码和二维码的第三方库 主要类: BitMatrix 位图矩阵 MultiFormatWriter 位图编写器 MatrixToImageWriter 写入图片 可以生成、识别条形码和二维码 内置三种尺寸: enum Size {SMALL, MIDDLE, BIG} 依赖 将宽度不等的多个黑条和白条,按照一定

    2024年02月08日
    浏览(44)
  • 【C#】最全单据打印源码(打印模板、条形码&二维码、字体样式)

    【C#】编号生成器(定义单号规则、固定字符、流水号、业务单号) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器(开始日期、结束日期) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129040663 【C#】组件化开发,调用dll组件方法 本文链接

    2024年02月03日
    浏览(44)
  • uniapp写微信小程序实现二维码条形码扫描识别

    1.最重要的就是一个函数uni.scanCode() 下边是我的代码可以直接使用 上述代码就直接实现了扫描功能很简单记得定义下扫描结果!有啥问题随时@我

    2024年04月09日
    浏览(48)
  • openmv和STM32串口通信识别条形码、二维码(HAL库)

    因为自己的毕设用到了条形码识别,所以在这里写一篇关于使用openmv识别条形码和二维码并且与STM32实现串口通讯,希望能帮到以后用到这一模块的同学,STM32方面我使用的是STM32F103RCT6,并且使用HAL进行编写代码。 OpenMV端:由图知UART_RX—P5 ------ UART_TX—P4 2.STM32端:这里我使用

    2023年04月13日
    浏览(42)
  • C#中轻松实现二维码和条形码识别:OpenCvSharp和ZXing详细教程

      概述: 本教程使用OpenCvSharp和ZXing库,详细介绍了在C#中识别二维码和条形码的步骤。通过导入必要的命名空间、加载图像,并使用ZXing库进行二维码和条形码的识别,提供了清晰的示例代码。这方便了开发人员在项目中集成二维码和条形码识别功能。 要使用OpenCvSharp来分别

    2024年03月09日
    浏览(64)
  • vue - H5 移动端网页中调用手机摄像头扫描二维码 / 条形码功能,在h5手机网页里调起相机摄像头进行二维码或条形码扫描效果详细教程(详细示例组件源码,一键复制开箱即用!)

    实现了在vue2、vue3网页项目中,实现调起手机摄像头进行扫描二维码或者条码,可自定义样式。 直接复制组件代码,然后根据你的需求改一下。

    2024年02月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包