You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安卓平台Kivy+OpenCV条码识别App开发协同问题求助

解决Kivy + OpenCV在安卓上的条码识别协同问题

你的代码存在几个核心问题,导致无法正常工作:

  • 同时初始化Kivy Camera 和OpenCV VideoCapture,安卓系统中摄像头只能被一个进程实例占用,会导致其中一个无法获取帧
  • build() 方法仅执行一次帧读取和识别,无法实现实时条码扫描
  • cv2.imshow() 不适用于安卓平台,安卓没有桌面式的窗口系统来显示OpenCV的窗口
  • 调用 self.read() 是错误的,应该是 self.capture.read(),且未判断帧读取是否成功

以下是修正后的代码,实现Kivy与OpenCV的协同工作,实时识别条码并在界面显示结果:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.camera import Camera
from kivy.uix.label import Label
from kivy.clock import Clock
from pyzbar.pyzbar import decode
import numpy as np
import cv2


class ScannerLayout(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.orientation = 'vertical'
        
        # 初始化Kivy Camera,这是安卓上获取摄像头帧的正确方式
        self.camera = Camera(play=True, resolution=(640, 480))
        self.add_widget(self.camera)
        
        # 用于显示条码识别结果的标签
        self.result_label = Label(text="等待扫描条码...", size_hint=(1, 0.1))
        self.add_widget(self.result_label)
        
        # 定时调用扫描函数,实现实时识别
        Clock.schedule_interval(self.scan_barcode, 1/30)  # 30帧/秒

    def scan_barcode(self, dt):
        # 从Kivy Camera的texture中获取帧数据
        texture = self.camera.texture
        if not texture:
            return
        
        # 将Kivy纹理转换为OpenCV可用的numpy数组
        frame = np.frombuffer(texture.pixels, dtype=np.uint8)
        frame = frame.reshape(texture.height, texture.width, 4)  # Kivy默认是RGBA格式
        frame = cv2.cvtColor(frame, cv2.COLOR_RGBA2BGR)  # 转换为OpenCV的BGR格式
        
        # 识别条码
        barcodes = decode(frame)
        if barcodes:
            for barcode in barcodes:
                barcode_data = barcode.data.decode('utf-8')
                barcode_type = barcode.type
                self.result_label.text = f"类型: {barcode_type}, 内容: {barcode_data}"
        else:
            self.result_label.text = "等待扫描条码..."


class MainApp(App):
    def build(self):
        return ScannerLayout()


if __name__ == "__main__":
    MainApp().run()

关键说明:

  • 放弃使用OpenCV的 VideoCapture,直接复用Kivy Camera 的帧数据,避免摄像头资源冲突
  • 通过 Clock.schedule_interval 定时执行扫描逻辑,实现实时识别
  • 将Kivy的RGBA格式纹理转换为OpenCV的BGR格式,保证条码识别的兼容性
  • 用Kivy的 Label 组件显示识别结果,替代安卓不支持的 cv2.imshow()
  • 增加帧数据判断,避免空纹理导致的崩溃

安卓打包注意事项:

  • 在buildozer.spec中添加依赖:requirements = python3,kivy,opencv,pyzbar
  • 配置摄像头权限:android.permissions = CAMERA

内容的提问来源于stack exchange,提问作者mouhcine alaoui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:40:41