K210摄像头矩形图坐标识别

这篇具有很好参考价值的文章主要介绍了K210摄像头矩形图坐标识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我接触的第一个硬件项目是设计一个简陋的智能视觉小车,我在项目里的任务是识别一张纸上六个目标点坐标然后发送给小车。

k210识别正确形状,ide,python

图一  场地样式

就是将上图六个点的坐标识别然后传输给小车。

识别效果大概是这样:

k210识别正确形状,ide,python

 图二 识别效果

因为是第一次做这样的项目,第一次使用maixpy不熟练之处还望大佬见谅,项目完成符合预期。

K210摄像头使用专门的maixpyIDE进行编辑。 它是用python语言进行编写但感觉缩进要求更加严格,不是四格缩进就会运行错误。

首先是导入:

import sensor,image,lcd,time

导入没有什么说法,设备、图像、显示屏、时间,没有其他特别的导入。

然后是初始化,因为之前没接触过硬件项目,初始化是直接拿的常用初始化:

lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(1)   #后置拍摄模式
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # 白平衡关闭
sensor.snapshot(1.8)#去鱼眼化

然后是一个找最大色块的函数:

def find_max(blobs): #找最大色块函数。这里是比较像素面积的方式,只返回最大面积色块
    max_size=0
    for blob in blobs:
        if blob[4] > max_size:
            max_blob=blob
            max_size = blob[4]
    return max_blob

因为坐标函数只是标注像素位置,所以我们要根据整个场地标注相对位置,这里是找黑线的方式找到整个场地,因为场地黑线过多所以要标注最大的黑色色块,就需要写一个只输出最大色块的函数。这里是通过比较所含像素点个数找到最大色块。blob[4]是像素个数。

要准确识别颜色就要准确的找到颜色阈值,可以通过工具——机器视觉——阈值编辑器找到颜色阈值。

k210识别正确形状,ide,python

 图三 阈值获取

导入图片文件调节阈值,当只有想要的颜色程白色时复制阈值,这个阈值摄像头识别的可能跟真实值有差距,调试的时候要在一定范围内稍微更改使摄像头识别更准确。

k210识别正确形状,ide,python

 图三 阈值编辑器

该项目阈值为:

green1_threshold   = (0, 55, -128, -18, 127, -18)
black_threshold  =(0, 46, -128, 15, -2, 44)

然后使用find-blobs进行颜色识别:

    blobs = img.find_blobs([black_threshold])#黑色边框定义识别
    blobs1 = img.find_blobs([green1_threshold])#绿色目标点定义

之后是识别黑色边框然后进行计算,算出一个单位长度的像素长度。

if blobs:        #寻找黑色边框
        max_blob = find_max(blobs)

        x1=max_blob[0]
        y1=max_blob[1]
        w1=max_blob[2]
        h1=max_blob[3]
        a1=(int((w1/2)+x1)-max_blob[0])/4
        a2=(int((h1/2)+y1)-max_blob[1])/4#计算单位坐标像素长度
        if a1==0:
            a1=1
        if a2==0:
            a2=1        #a1、a2之后要做分母,摄像镜头一开始找目标可能会出现0这里去零
        img.draw_rectangle(max_blob[0:4], color=(0,0,0))#对找到的目标进行黑框标注
        img.draw_cross(int((w1/2)+x1), int((h1/2)+y1))#使用十字标注目标中心点位置
        img.draw_string(max_blob[0],max_blob[1], (str(max_blob[0])+','+str(max_blob[1])), color = (0,0,0))#在显示屏标注目标最左和最下的坐标

这里的计算单位长度是按照该项目8*8的场地计算的,如果要计算其他规格的场地,上面代码写的复杂了,大致是黑框长度max-blob除以场地x格数,这里是除以八。

然后是寻找绿色目标,并计算目标坐标。

    if (blobs and blobs1):#寻找绿色目标点

        for b in blobs1:
            i=i+1
            x = b[0]
            y = b[1]
            width = b[2]
            height = b[3]




            if (x>=x1 and x<=x1+w1 and y>=y1 and y<=h1):
                c1=int(((b[5]-x1)+10)/a1)
                c2=int(((b[6]-y1)+10)/a2)#计算目标点坐标这里加10是摄像头有误差,我的加10最准确

                img.draw_rectangle([x,y,width,height])#用矩形标记出目标颜色区域
                t1[i-1]=8-abs(c1)
                t2[i-1]=8-abs(c2)#因为显示屏上图像是反转的,所以这里要用8减去。这里要看初始化跟不跟我的一样
                t=[t1[i-1],t2[i-1]]#形成数组,这就是目标点的坐标
                img.draw_cross(b[5], b[6]) #用十字标注目标中心点

要注意的是计算坐标时要不断调试,加减像素值防止较大误差,这里就在坐标上加了10个像素值才能准确的显示坐标,不同设备可能不一样。

后面包括去重复数据和显示屏显示注释比较全,不一一说明这里直接上完整代码。

完整代码:文章来源地址https://www.toymoban.com/news/detail-575306.html

import sensor,image,lcd,time
green1_threshold   = (0, 55, -128, -18, 127, -18)
black_threshold  =(0, 46, -128, 15, -2, 44)

#常用初始化
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(1)   #后置拍摄模式
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # 白平衡关闭
sensor.snapshot(1.8)#去鱼眼化
def find_max(blobs): #找最大色块函数。这里是比较像素面积的方式,只返回最大面积色块
    max_size=0
    for blob in blobs:
        if blob[4] > max_size:
            max_blob=blob
            max_size = blob[4]
    return max_blob
i=0#循环计数
m=0#去除重复计数
t1=[0 for n in range(10000)]
t2=[0 for n in range(10000)]   #将t1和t2进行数组化,便于之后去重复数据
while True:
    img=sensor.snapshot()
    img = sensor.snapshot().lens_corr(strength = 1.2, zoom = 1.0)  #调整显示屏使其更“平整”便于识别,里面参数可更改
    blobs = img.find_blobs([black_threshold])#黑色边框定义识别
    blobs1 = img.find_blobs([green1_threshold])#绿色目标点定义


    if blobs:        #寻找黑色边框
        max_blob = find_max(blobs)

        x1=max_blob[0]
        y1=max_blob[1]
        w1=max_blob[2]
        h1=max_blob[3]
        a1=(int((w1/2)+x1)-max_blob[0])/4
        a2=(int((h1/2)+y1)-max_blob[1])/4#计算单位坐标像素长度
        if a1==0:
            a1=1
        if a2==0:
            a2=1        #a1、a2之后要做分母,摄像镜头一开始找目标可能会出现0这里去零
        img.draw_rectangle(max_blob[0:4], color=(0,0,0))#对找到的目标进行黑框标注
        img.draw_cross(int((w1/2)+x1), int((h1/2)+y1))#使用十字标注目标中心点位置
        img.draw_string(max_blob[0],max_blob[1], (str(max_blob[0])+','+str(max_blob[1])), color = (0,0,0))
        #在显示屏标注目标最左和最下的坐标
        if (max_blob[1]==0):#因为周围环境黑色较多,这里设置当黑色边框顶格时卡顿一下,调整摄像头恢复
            continue

    if (blobs and blobs1):#寻找绿色目标点

        for b in blobs1:
            i=i+1
            x = b[0]
            y = b[1]
            width = b[2]
            height = b[3]




            if (x>=x1 and x<=x1+w1 and y>=y1 and y<=h1):
                c1=int(((b[5]-x1)+10)/a1)
                c2=int(((b[6]-y1)+10)/a2)#计算目标点坐标这里加10是摄像头有误差,我的加10最准确

                img.draw_rectangle([x,y,width,height])#用矩形标记出目标颜色区域
                t1[i-1]=8-abs(c1)
                t2[i-1]=8-abs(c2)#因为显示屏上图像是反转的,所以这里要用8减去。这里要看初始化跟不跟我的一样
                t=[t1[i-1],t2[i-1]]#形成数组,这就是目标点的坐标
                img.draw_cross(b[5], b[6]) #用十字标注目标中心点
            
                n=0
                j=0

                while j<i: #防重复
                    if (t1[i-1]==t1[j-1] and t2[i-1]==t2[j-1]):
                        n=i+1
                    j=j+1
                if (n==0 and (abs(t1[i-1])<9)):#这里是对点进行输出,重复点不输出
                    print(t)
                    m=m+1#计数,记录输出几个点
                img.draw_string(x,y, "x")#标注文本x、y
                img.draw_string(x+10, y, str(t))#标注坐标
                img.draw_string(x,y+20, "green")#标注文本green如果是其他颜色请更改

    lcd.display(img)#lcd屏幕显示

到了这里,关于K210摄像头矩形图坐标识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • K210学习笔记(七):画图与颜色识别

    在之前我们学会了关于K210的摄像头与lcd的一些应用,那么今天我们了解一些关于K210的一些画图的方法和利用K210进行颜色识别。 首先我们明确,什么是画图,为什么要画图。画图指在图片上画出圆,方框,箭头,十字交叉或者字符。我们为什么要画图,其实一个基础的应用就

    2024年02月15日
    浏览(41)
  • K210学习笔记(九):KPU之人脸识别

    K210进入到这里总算是要进入这块板子的精髓部分了,超低功耗配备的超强算力,所谓的KPU可以理解成显卡,可以给模型的运算提提速。我们来简单介绍一下KPU部分(来源MicorPython从0到1): KPU 是 K210 内部一个神经网络处理器, 它可以在低功耗的情况下实现卷积神经网络计算

    2024年02月12日
    浏览(54)
  • K210学习笔记(十):KPU之物体识别

    进行到KPU的又一个应用咯,其实跟前一个人脸识别的应用没有太多的不同。物体识别这里可是分类二十个物体,而人脸识别只是一个简单的二分类问题。(理论上机器学习也能做但是效果咋样就不知道了)。 大概的程序思路跟上一个实验也是一致的,将该用的函数库导入之后

    2024年02月13日
    浏览(46)
  • K210学习笔记(八):颜色识别计数与二维码识别

    宿醉断更enmmm(喝多太难受了)。前面我们介绍了使用K210进行颜色识别,在实际工程中,我们可能不止需要单纯的识别出来颜色,可能还需要计数(比如前段时间看到的有串串店利用摄像头拍照识别签子数的),当然,识别签子数肯定不是简单的颜色识别计数能解决的,为了

    2024年02月13日
    浏览(40)
  • 【01Studio MaixPy AI K210】13.颜色识别

    目录 导包: image库 LAB模型 例程: 测试图片  

    2024年02月14日
    浏览(42)
  • K210识别应用:基于yolov2模型的数字识别控制舵机

              注:此文章转载于本人的微信公众号:Young L童鞋                                                                           关注我,走进嵌入式江湖  电赛期间,在实验室学长的引领下入手了一块K210,在很多比赛中,K210的作用是用来做视觉部分,当然也可以用到

    2024年02月15日
    浏览(37)
  • K210 Mx-yolov3模型训练和物体识别

    一、简介        (1)硬件准备:               K210开发板:拥有1TOPS算力,可以运行神经网络模型,同时其提供在线模型训练平台(maixhub),支持物体分类和物体识别。        (2)软件环境               Mx-yolov3:(用于在本地训练模型)             

    2024年02月15日
    浏览(45)
  • STM32如何通过K210进行物体识别(1.开发环境搭建)

    本来参加智能物流机器人比赛是要用OpenMV的,但无奈于诸多因素只有K210可以使用,这也算是不幸中的万幸吧。这篇文章也作为我这一段时间的学习K210进行物体识别的复习与总结(因为种种原因,比赛也面临无法完成,大哭;人工智能小白一枚,欢迎各路大神指正,求轻喷)

    2023年04月10日
    浏览(44)
  • 【K210开发板】人脸识别+ SD卡断电存储 --实时按键录取人脸信息并识别

    人脸识别就是在人脸检测的基础上,除了检测人脸的位置外,还可以检测出这个人是谁(需要先对准人按按钮学习)。 先到 maixhub 按照说明下载模型, 获得模型smodel, 就是 加密版本的kmodel。下载后缀为.smodel模型需要用到机器码。机器码是 一机一码 的一种加密方式,用于模型

    2024年02月02日
    浏览(108)
  • STM32CubeMx学习与K210串口通信+识别橘色色块——点亮小灯

     K210模块的串口发送代码 识别色块 +数字处理 这里zz是4个数字的数,则需要分成千百位和低二位传输 zz是距离。也映射了距离的算法 整体K210代码 STM32串口接受端函数 判断帧头帧尾 如果数据正常 判断 数据是否合格 若合格则点灯 否则灭灯 不要忘记加入

    2024年02月14日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包