利用opencv实现二维码检测(简单易上手)

前言 

二维码检测是一个简单易上手的小项目,掌握opencv基础的语句就可以实现。解析二维码的过程有专门的库来实现,所以只需调相应的库就好了。在实现这个代码前,先要配置opencv环境。

Python与Opencv配置安装_哔哩哔哩_bilibili 这里用anaconda配置很方便

相关代码

图像的简单处理

import cv2 #导入opencv
img=cv2.imread('path') #读取图片路径,path指图片相关路径
cv2.imshow('name', img) #显示图像(窗口命名,传入图像变量名)
cv2.waitKey(0) #窗口等待时间,以毫秒为单位。当传入参数为0时,图像将一直显示,直至关闭。
cv2.waitKey(1) == 27 #也可以通过按键绑定来执行窗口的退出,此处为esc键退出
cv2.destroyAllWindows() #把图像从内存中删除

视频的简单处理

cap = cv2.VideoCapture(0) #读取视频文件,0是打开默认摄像头(即笔记本自带的),1是第二个摄像头
While true: #读取视频的每一帧
    success, img = cap.read() #success表示有无成功读取的bool值,img是每一帧图像
    cv2.show(img) #在窗口显示这一帧

简单的绘图


start_point = (100, 100) #定义矩形的左上角和右下角坐标
end_point = (400, 400)
color = (0, 255, 0)  #定义矩形的颜色和线宽(B,G,R)
thickness = 2 #线宽
cv2.rectangle(img, start_point, end_point, color, thickness) #绘制矩形


center_coordinates = (256, 256) #定义圆心坐标和半径
radius = 100
color = (0, 255, 0) # 定义圆的颜色和线宽
thickness = 2
cv2.circle(img, center_coordinates, radius, color, thickness) #绘制圆

实现思路

摄像头帧画面的提取:调用while循环持续展示摄像头捕捉到的画面(如果不关闭显示窗口的话会一直执行while语句里的代码)

二维码位置提取和框定:利用point提取二维码位置,point 是一个包含四个元素的元组,表示矩形的左上角坐标和宽高。再利用cv2.rectangle 函数绘制矩形,其中 (point[0], point[1]) 是左上角坐标,(point[0]+point[2], point[1]+point[3]) 是右下角坐标

二维码解析和网页跳转(库实现):(在python的设置里下载pyzbar的软件包)调用pyzbar库的decode函数获取二维码信息,调用webbrowser跳转网页(这个库是py自带的,直接调)

二维码信息展示创建data列表存入解析出来的网址

要注意的问题和解决方法

正常来说摄像头在捕捉到二维码并进行解析后,会展示解析出来的地址并跳转到相应的网页。

而此时如果不关闭显示窗口的话,二维码就会持续被摄像头捕捉,代码就会一直去执行刚刚的操作,也就是会不断新增同一个网页和重复显示已经出现的地址。

简单来说就是要对代码进行优化,让他不要进行重复的操作,即有几个二维码就生成几个信息。

所以我们要设置一个计数器,用来计算data列表中存入了几个信息。还要设置一个状态值flag,我们可以理解为bool值,用来判定该二维码是否已经被解析过。1表示未被解析过,要执行解析操作,0表示已被解析,跳过该过程。

当时用了近一个小时才解决掉了这个问题。。。。。。

结尾

这只是opencv很基础的一部分。还有更多的知识和理论等着我们去学习。我也是计算机视觉领域的初学者(大一新牲),纯纯小白一个。也是第一次写技术文档,浅浅分享我的心得,希望对大家有所帮助。

最终代码展示

import cv2
import webbrowser #用于网页跳转
from pyzbar.pyzbar import decode #导入pyzbar库,该库是一个用于解析条形码和二维码的Python库
cap = cv2.VideoCapture(0) #调用摄像头
data = ['Code'] #存放在二维码识别到的地址
a = 0 #记录data列表中解析二维码的地址个数
flag = 1 #flag为bool值,为1的时候表示data列表中没有该二维码地址,则执行添加操作。

while True: #让摄像头画面一帧一帧显示
    success , img = cap.read()  #img是一帧的信息,success是一个bool值,表示是否成功读取到这一帧
    codes = decode(img) #使用pyzbar解码图像中的条形码或二维码

    for code in codes: #遍历解码结果
        code_data = code.data.decode('utf-8') #提取解码的数据
        for i in range(a+1): #遍历data列表查看识别到的二维码地址是否已存在
            if (code_data == data[i]): #如果存在则flag=0,不执行插入操作
                flag = 0

        if flag == 1: #将新的地址插入到data列表
            data.append(code_data)
            webbrowser.open(code_data)
            print(data)
            a += 1 #计数
        flag = 1   #刷新flag的值
        point = code.rect  # 提取条形码或二维码的位置信息
        cv2.rectangle(img,(point[0],point[1]),(point[0]+point[2],point[1]+point[3]),(0,255,0),5)  #框定二维码区域
    cv2.namedWindow('Code', cv2.WINDOW_NORMAL)    #创建窗口
    cv2.imshow("Code",img)      #展示窗口
    if cv2.waitKey(1) == 27:    #esc退出
        break


  • 28
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用ROS和OpenCV实现二维码检测,可以按照以下步骤进行操作: 1. 安装ROS和OpenCV:首先,确保你已经安装了ROS和OpenCV。你可以通过以下命令来安装它们: ```shell sudo apt-get install ros-<distro>-opencv ``` 其中,`<distro>`是你正在使用的ROS发行版的名称,例如`melodic`或`noetic`。 2. 创建ROS包:在ROS工作空间中创建一个新的ROS包,你可以使用以下命令: ```shell cd ~/catkin_ws/src catkin_create_pkg qr_code_detection roscpp rospy cv_bridge sensor_msgs ``` 这将在`~/catkin_ws/src`目录下创建一个名为`qr_code_detection`的ROS包,并添加所需的依赖项。 3. 下载二维码检测节点:下载并将二维码检测节点添加到ROS包中。你可以使用以下命令: ```shell cd ~/catkin_ws/src/qr_code_detection git clone https://github.com/ros-perception/opencv_apps.git ``` 这将在`~/catkin_ws/src/qr_code_detection`目录下创建一个名为`opencv_apps`的文件夹,并将二维码检测节点添加到其中。 4. 构建ROS包:在ROS工作空间中构建ROS包,你可以使用以下命令: ```shell cd ~/catkin_ws catkin_make ``` 这将编译ROS包并生成可执行文件。 5. 运行二维码检测节点:使用以下命令来运行二维码检测节点: ```shell rosrun qr_code_detection qr_code_detection_node ``` 这将启动二维码检测节点,并开始检测摄像头图像中的二维码。 请注意,以上步骤假设你已经连接了一个摄像头,并且ROS已经正确配置。如果你没有连接摄像头,你可以使用ROS提供的图像仿真工具来模拟摄像头图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值