長方形、円、三角形を識別するための確実な OpenMV メソッド

1.公式サイトでの方法

find_circles() と find_rects() を直接使用して長方形と円を識別し、find_lines() 関数を使用して 3 本の直線を見つけ、三角形の内角と 180° を使用して三角形を識別します。
find_circles() 詳細説明
ここに画像の説明を挿入
find_rects() 詳細説明
ここに画像の説明を挿入
find_lines() 詳細説明
ここに画像の説明を挿入
认真看手册!认真看手册!认真看手册!重要问题说三遍!
関数に割り当てられたパラメータは、最終的な認識効果に大きな影響を与えるため、パラメータをよく理解し、根気よく調整してください。
これらの機能を使用すると、多くの機能が認識されるか、まったく認識されないかのどちらかになりますが、解決策としては、画像をさらに処理するかフィルターすることです。背景が乱雑な場合、この方法による三角形認識の誤差は非常に大きくなります。

次に、識別カラーブロックを使用します。

私のやり方は主にカラーブロックの識別で、まず色を識別してから形状を識別し、判断の範囲を狭めます。
公式サイトのマニュアルにあるfind_blobs()の詳しい説明では
主にblob.density()という関数を使ってカラーブロックの濃度を返しています。これは、カラーパッチのピクセル数を外枠の面積で割ったものに等しくなります。正投影長方形の場合、この値は 1 に等しく、正投影円の場合、この値は π/4 に等しく、正投影三角形の場合、この値は 0.5 未満である必要があります。しかし実際には、カメラは必ずしも正面を向いているわけではなく、他の要因の影響を受けてこの値は上下に変動します。パラメータを調整する最も効果的な方法は、まず長方形、円、三角形のそれぞれのdensity()を出力し、おおよその範囲を見てパラメータを決定することです。
コードは以下のように表示されます。

def detect(max_blob):#输入的是寻找到色块中的最大色块
    row_data=[-1,-1]#保存颜色和形状
    print(max_blob.solidity())
  
    if max_blob.density()>0.84:
        row_data[0]=max_blob.code()
        img.draw_rectangle(max_blob.rect())
        row_data[1]=1#表示矩形

    elif max_blob.density()>0.6:
        img.draw_circle((max_blob.cx(), max_blob.cy(),int((max_blob.w()+max_blob.h())/4)))
        row_data[0]=max_blob.code()
        row_data[1]=2#表示圆形
    elif max_blob.density()>0.4:
        row_data[0]=max_blob.code()
        row_data[1]=3#表示三角形
    return row_data#返回的是两个值,颜色和形状

これで終わりですが、常に問題がありました。長方形が斜めに傾いたり回転したりすると、計算されたdensity()の値は確かに円に非常に近くなり、場合によっては円として認識されます。下げると、円を長方形として認識します。
同級生に教えてもらい、Xingtong Technologyには載っていない関数max_blob.solidity()があることを知りました。この関数は長方形の識別に使用します。
最終コード:

def detect(max_blob):#输入的是寻找到色块中的最大色块
    row_data=[-1,-1]#保存颜色和形状
    print(max_blob.solidity())
  
    if max_blob.solidity()>0.9 or max_blob.density()>0.84:
        row_data[0]=max_blob.code()
        img.draw_rectangle(max_blob.rect())
        row_data[1]=1#表示矩形

    elif max_blob.density()>0.6:
        img.draw_circle((max_blob.cx(), max_blob.cy(),int((max_blob.w()+max_blob.h())/4)))
        row_data[0]=max_blob.code()
        row_data[1]=2#表示圆形
    elif max_blob.density()>0.4:
        row_data[0]=max_blob.code()
        row_data[1]=3#表示三角形
    return row_data #返回的是两个值,颜色和形状

おすすめ

転載: blog.csdn.net/weixin_52385589/article/details/126443973