363|0

88

帖子

3

TA的资源

一粒金砂(高级)

楼主
 

[嘉楠 CanMV K230]测评 ⑦线段、各种形状检测 [复制链接]

 
本帖最后由 不爱胡萝卜的仓鼠 于 2024-10-5 17:26 编辑

        图像识别最基础的就是各种线条、形状的识别,今天就来完成这个第一步。

        今天使用的代码的基础框架就是沿用上一篇的代码(但是我把帧率的代码去掉了,那个对我来说没什么用,还会耗费资源),如果不出意外的话,这将会是后续测试的一个基础模板。由于使用之前的1920*1080分辨率再增加图像识别代码会导致内存不够用,所以我这边把分辨率调低,改成教程推荐的320x240。具体代码如下:

import time, os, sys

from media.sensor import *
from media.media import *
from media.display import *

def camera_test():
    print("camera_test")

    #用默认配置构造一个Sensor对象
    sensor = Sensor()
    #复位摄像头
    sensor.reset()
    
    #设置摄像头水平翻转
    sensor.set_hmirror(False)
    #设置摄像头垂直翻转
    sensor.set_vflip(False)

    #设置指定通道的输出图像尺寸, 320x240
    sensor.set_framesize(width=320, height=240)
    #设置指定sensor设备和通道的输出图像格式
    sensor.set_pixformat(Sensor.RGB565)

    #通过IDE缓冲区显示图像
    Display.init(Display.VIRT, sensor.width(), sensor.height())
    
    #初始化media manager
    MediaManager.init()
    #摄像头开始工作
    sensor.run()

    try:
        while True:
            os.exitpoint()
            
            #摄像头拍一张照片
            img = sensor.snapshot()
            Display.show_image(img)

    except KeyboardInterrupt as e:
        print("user stop: ", e)
    except BaseException as e:
        print(f"Exception {e}")
        
    #摄像头停止工作
    sensor.stop()
    # deinit display
    Display.deinit()
    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
    time.sleep_ms(100)
    #media manager去初始化
    MediaManager.deinit()

if __name__ == "__main__":
    os.exitpoint(os.EXITPOINT_ENABLE)
    camera_test()

 

一.线条检测

        线条检测有2个函数可以使用,分别是find_lines、find_line_segments。他们在官方文档中的链接:https://developer.canaan-creative.com/k230_canmv/main/zh/api/openmv/image.html#find-lineshttps://developer.canaan-creative.com/k230_canmv/main/zh/api/openmv/image.html#find-line-segments

       前者是找直线,后者是找线段。

 

 

        我们这里就用一下找线段吧。

        代码如下

import time, os, sys

from media.sensor import *
from media.media import *
from media.display import *

def camera_test():
    print("camera_test")

    #用默认配置构造一个Sensor对象
    sensor = Sensor()
    #复位摄像头
    sensor.reset()
    
    #设置摄像头水平翻转
    sensor.set_hmirror(False)
    #设置摄像头垂直翻转
    sensor.set_vflip(False)

    #设置指定通道的输出图像尺寸, 320x240
    sensor.set_framesize(width=320, height=240)
    #设置指定sensor设备和通道的输出图像格式
    sensor.set_pixformat(Sensor.RGB565)

    #通过IDE缓冲区显示图像
    Display.init(Display.VIRT, sensor.width(), sensor.height())
    
    #初始化media manager
    MediaManager.init()
    #摄像头开始工作
    sensor.run()

    try:
        while True:
            os.exitpoint()
            
            #摄像头拍一张照片
            img = sensor.snapshot()
            
            ###################图像识别代码#######################
            #循环找线段,把所有线段找出来
            for l in img.find_line_segments(merge_distance = 10, max_theta_diff = 15):
                #在画面上画线,把找到的线段画出来
                img.draw_line(l.line(), color = (255, 0, 0), thickness=2)
            ###################图像识别代码#######################
            
            Display.show_image(img)

    except KeyboardInterrupt as e:
        print("user stop: ", e)
    except BaseException as e:
        print(f"Exception {e}")
        
    #摄像头停止工作
    sensor.stop()
    # deinit display
    Display.deinit()
    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
    time.sleep_ms(100)
    #media manager去初始化
    MediaManager.deinit()

if __name__ == "__main__":
    os.exitpoint(os.EXITPOINT_ENABLE)
    camera_test()

        我在纸上画了横、竖、斜的三条线段,通过调整2个参数,成功识别到了

 

二.矩形检测

        矩形检测函数官方文档说明:https://developer.canaan-creative.com/k230_canmv/main/zh/api/openmv/image.html#find-rects

        代码如下:

import time, os, sys

from media.sensor import *
from media.media import *
from media.display import *

def camera_test():
    print("camera_test")

    #用默认配置构造一个Sensor对象
    sensor = Sensor()
    #复位摄像头
    sensor.reset()
    
    #设置摄像头水平翻转
    sensor.set_hmirror(False)
    #设置摄像头垂直翻转
    sensor.set_vflip(False)

    #设置指定通道的输出图像尺寸, 320x240
    sensor.set_framesize(width=320, height=240)
    #设置指定sensor设备和通道的输出图像格式
    sensor.set_pixformat(Sensor.RGB565)

    #通过IDE缓冲区显示图像
    Display.init(Display.VIRT, sensor.width(), sensor.height())
    
    #初始化media manager
    MediaManager.init()
    #摄像头开始工作
    sensor.run()

    try:
        while True:
            os.exitpoint()
            
            #摄像头拍一张照片
            img = sensor.snapshot()
            
            ###################图像识别代码#######################
            #循环找矩形,把所有矩形找出来
            for r in img.find_rects(threshold = 10000):
                #把矩形画到图片上
                img.draw_rectangle(r.rect(), color = (255, 0, 0),thickness=2)
            ###################图像识别代码#######################
            
            Display.show_image(img)

    except KeyboardInterrupt as e:
        print("user stop: ", e)
    except BaseException as e:
        print(f"Exception {e}")
        
    #摄像头停止工作
    sensor.stop()
    # deinit display
    Display.deinit()
    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
    time.sleep_ms(100)
    #media manager去初始化
    MediaManager.deinit()

if __name__ == "__main__":
    os.exitpoint(os.EXITPOINT_ENABLE)
    camera_test()

 

 

三.圆形检测

        矩形检测函数官方文档说明:https://developer.canaan-creative.com/k230_canmv/main/zh/api/openmv/image.html#find-rects

        代码如下:

import time, os, sys

from media.sensor import *
from media.media import *
from media.display import *

def camera_test():
    print("camera_test")

    #用默认配置构造一个Sensor对象
    sensor = Sensor()
    #复位摄像头
    sensor.reset()
    
    #设置摄像头水平翻转
    sensor.set_hmirror(False)
    #设置摄像头垂直翻转
    sensor.set_vflip(False)

    #设置指定通道的输出图像尺寸, 320x240
    sensor.set_framesize(width=320, height=240)
    #设置指定sensor设备和通道的输出图像格式
    sensor.set_pixformat(Sensor.RGB565)

    #通过IDE缓冲区显示图像
    Display.init(Display.VIRT, sensor.width(), sensor.height())
    
    #初始化media manager
    MediaManager.init()
    #摄像头开始工作
    sensor.run()

    try:
        while True:
            os.exitpoint()
            
            #摄像头拍一张照片
            img = sensor.snapshot()
            
            ###################图像识别代码#######################
            for c in img.find_circles(threshold = 3500, x_margin = 10, y_margin= 10,
                                              r_margin = 10,r_min = 2, r_max = 100, r_step = 2):
                #画红色圆做指示
                img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0),thickness=2)
            ###################图像识别代码#######################
            
            Display.show_image(img)

    except KeyboardInterrupt as e:
        print("user stop: ", e)
    except BaseException as e:
        print(f"Exception {e}")
        
    #摄像头停止工作
    sensor.stop()
    # deinit display
    Display.deinit()
    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
    time.sleep_ms(100)
    #media manager去初始化
    MediaManager.deinit()

if __name__ == "__main__":
    os.exitpoint(os.EXITPOINT_ENABLE)
    camera_test()
 

我在纸上放了一个一元钱硬币,识别成功 

 

 

四.中途出现的BUG

        在刚开始测试时,我遇到了一个很奇怪的BUG,代码停止运行时即使已经调用了去初始化的代码,但是在此运行时只要有图像识别的代码,例如线条检测,一运行到线条检测代码日志就报“Exception Out of fast frame buffer stack memory”,如下图所示

意思就是说“超出快速帧缓冲区堆栈内存”,简单来说就是内存炸了。但是我们这块开发板可是有1G内存的,不管怎么说都不会说内存不够用啊

        我查了网上,基本上就是说代码消耗内存太厉害了,要降级分辨率,但是我尝试把分辨率调整到最小的88x72的QQCIF,并且关闭了display都不行,一运行线条检测的函数就报错,把这句话去掉,就可以正常工作。折腾我快一个小时,也没折腾出结果,我裂开了

        最终的解决方案是:重启(按一下开发板的RST按钮)。。。。。。果然遇到问题就重启

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
[精典书籍]蓝牙核心技术(供通信行业研究开发人员参考)

本书系由参与蓝牙标准制定的两位成员撰写,共四个部分17章,内容涉及目前蓝牙无线技术所面临的挑战\应用模式\蓝牙协议栈\蓝牙协议 ...

【电子设计大赛】角度传感器应用文章集萃

这是在万方上下的角度传感器的一些文章,希望对大家有所帮助。 6117

wiggler板PCB

wiggler板PCB

电子工程师设计经验随笔

电子工程师必备基础知识(一) 运算放大器通过简单的外围元件,在模拟电路和数字电路中得到非常广泛的应用。运算放大器有好些个 ...

【奖品发送完毕】:有奖直播英飞凌工业半导体在电机驱动行业中的应用

【奖品发送完毕】 如有问题请联系管理员QQ:375277221 活动详情:有奖直播英飞凌工业半导体在电机驱动行业中的应用 ...

【NUCLEO-L552ZE测评】2. 资源

1 .开发环境 首先建议大家把ST的软件全家桶装上,我之前熟悉TouchGFX的时候走了好多弯路,装上全家桶后基本没多少环境 ...

如何设计支持任天堂SWITCH游戏机的转接底座?

任天堂的SWITCH游戏机自从2017年发布至今,销量直奔一亿台,没什么意外的话,将超过PS4的销售记录。这让一些在SWITCH刚发布时不 ...

关于EFR32BG22系列蓝牙连接成功率低的解决方法

本帖最后由 skywalker_lee 于 2021-3-25 09:33 编辑 采用EFR32BG22C112F352GM32进行蓝牙设备开发时,当Simplicity Studio的Bl ...

TL5728-IDK-A3板子与网口对应关系

# TL5728-IDK-A3板子与网口对应关系 566757 566758

B-U585I-IOT02A蓝牙问题解决

这个开发板的蓝牙问题已经困扰我很长时间了,可能所有开发板在出厂时都没有带STM32WB的蓝牙固件,所以使用STM32U585官方例程时一 ...

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表