• 方案介紹
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

3.4.6-識別形狀+顏色+增加最小變化閾值+增加最大變化閾值 STM32串口通信

03/20 08:44
818
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

聯(lián)系方式.txt

共1個文件

非常詳細的視頻和文字教程,講解常見的openmv教程包括 巡線、物體識別、圓環(huán)識別、閾值自動獲取等。非常適合學習openmv、K210、K230等項目
視頻合集鏈接在:


openmv教程合集 openmv入門到項目開發(fā) openmv和STM32通信 openmv和opencv區(qū)別 openmv巡線 openmv數(shù)字識別教程LCD

3.4.6-識別形狀+顏色+增加最小變化閾值+增加最大變化閾值

增加最大變化閾值來解決半徑識別錯誤,經(jīng)常出現(xiàn)識別很大半徑

import sensor, image, time
#教程作者:好家伙VCC
#歡迎交流群QQ: 771027961 作者郵箱: 1930299709@qq.com
#更多教程B站主頁:[好家伙VCC的個人空間-好家伙VCC個人主頁-嗶哩嗶哩視頻](https://space.bilibili.com/434192043)
#淘寶主頁鏈接:[首頁-好家伙VCC-淘寶網(wǎng)](https://shop415231378.taobao.com)
#更多嵌入式手把手教程-盡在好家伙VCC
# 定義顏色閾值(L, A, B),用于識別紅色
color_threshold = (0, 100, 0, 127, 0, 127)

# 初始化攝像頭模塊
sensor.reset()  # 重置攝像頭,確保設(shè)備正常工作
sensor.set_pixformat(sensor.RGB565)  # 設(shè)置攝像頭的像素格式為RGB565
sensor.set_framesize(sensor.QQVGA)  # 設(shè)置分辨率為QQVGA(160x120)

# *************************** 如果不需要鏡像就注釋掉以下代碼 **************************
sensor.set_vflip(True)  # 垂直翻轉(zhuǎn)
sensor.set_hmirror(True)  # 水平翻轉(zhuǎn)
# *************************** 如果不需要鏡像就注釋掉以上代碼 **************************

sensor.skip_frames(time=2000)  # 跳過前幾幀,確保圖像穩(wěn)定
sensor.set_auto_gain(False)  # 關(guān)閉自動增益
sensor.set_auto_whitebal(False)  # 關(guān)閉自動白平衡

# 創(chuàng)建時鐘對象
clock = time.clock()

# *************************** 最小變化閾值濾波 **************************    
# 位置和半徑變化閾值
position_threshold = 4  # 位置變化的最小閾值
radius_threshold = 4    # 半徑變化的最小閾值
MAX_CHANGE_THRESHOLD = 80  # 最大變化閾值(例如位置或半徑變化超過此值時不更新)

# 上一幀的圓心坐標和半徑
prev_x, prev_y, prev_r = None, None, None
# *************************** 最小變化閾值濾波 **************************

# 主循環(huán),不斷獲取攝像頭圖像并進行處理
while True:
    clock.tick()  # 計時當前幀的處理時間

    # 獲取當前圖像并進行鏡頭畸變校正
    img = sensor.snapshot().lens_corr(1.8)

    # 使用霍夫變換查找圓形
    for c in img.find_circles(
        threshold=2500,  # 圓形檢測閾值
        x_margin=10,     # 圓心X坐標誤差范圍
        y_margin=10,     # 圓心Y坐標誤差范圍
        r_margin=10,     # 圓半徑誤差范圍
        r_min=2,         # 圓的最小半徑
        r_max=100,       # 圓的最大半徑
        r_step=2         # 圓半徑變化步長
    ):
        # 計算圓形的外接矩形區(qū)域
        area = (c.x() - c.r(), c.y() - c.r(), 2 * c.r(), 2 * c.r())  # (x, y, width, height)
        statistics = img.get_statistics(roi=area)

        # 判斷該區(qū)域是否為紅色圓
        if (
            color_threshold[0] < statistics.l_mode() < color_threshold[1] and
            color_threshold[2] < statistics.a_mode() < color_threshold[3] and
            color_threshold[4] < statistics.b_mode() < color_threshold[5]
        ):
            # 獲取當前圓心和半徑
            x, y, r = c.x(), c.y(), c.r()

            # 如果是第一次檢測,更新值
            if prev_x is None or prev_y is None or prev_r is None:
                prev_x, prev_y, prev_r = x, y, r
                img.draw_circle(x, y, r, color=(192, 255, 0))  # 繪制圓形

            else:
                # 計算變化量
                x_change = abs(x - prev_x)
                y_change = abs(y - prev_y)
                r_change = abs(r - prev_r)

                # 判斷變化是否大于最小閾值,并且變化小于最大閾值
                if (
                    (x_change > position_threshold or y_change > position_threshold or r_change > radius_threshold) and
                    (x_change <= MAX_CHANGE_THRESHOLD and y_change <= MAX_CHANGE_THRESHOLD and r_change <= MAX_CHANGE_THRESHOLD)
                ):
                    # 變化大于最小閾值且不超過最大閾值,更新值
                    prev_x, prev_y, prev_r = x, y, r
                    img.draw_circle(x, y, r, color=(192, 255, 0))
                    print("Circle found: x = {}, y = {}, radius = {}".format(x, y, r))
                else:
                    # 變化小于閾值,繪制上次的坐標和半徑
                    img.draw_circle(prev_x, prev_y, prev_r, color=(192, 255, 0))
                    print("Circle found: x = {}, y = {}, radius = {}".format(prev_x, prev_y, prev_r))

        else:
            # 如果不是紅色圓形,用白色矩形框標記該區(qū)域
            img.draw_circle(c.x(), c.y(), c.r(), color=(255, 255, 255))  # 白色

    # 打印當前幀率
    print("FPS %f" % clock.fps())

  • 聯(lián)系方式.txt
    下載

相關(guān)推薦

方案定制

去合作
方案開發(fā)定制化,2000+方案商即時響應(yīng)!