欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9661|回復: 9
收起左側

MicroPython openmv識別直角

  [復制鏈接]
ID:323148 發表于 2018-5-14 21:23 | 顯示全部樓層 |閱讀模式
openmv 識別直角


  1. import sensor
  2. import image
  3. import time
  4. import math
  5. import pyb
  6. from pyb import Pin, Timer, UART,LED
  7. from GeometryFeature import GeometryFeature

  8. # 當光線弱的時候,用于補光
  9. LED(4).on()

  10. # 是否開啟debug模式
  11. # 如果是False就不print, 不進行可視化繪制,可以提高幀率
  12. is_debug = True
  13. #--------------感光芯片配置  START -------------------

  14. DISTORTION_FACTOR = 1.5 # 設定畸變系數
  15. IMG_WIDTH  = 64
  16. IMG_HEIGHT = 64
  17. def init_sensor():
  18.     '''
  19.     初始化感光芯片
  20.     '''
  21.     sensor.reset()
  22.     sensor.set_pixformat(sensor.GRAYSCALE)
  23.     sensor.set_framesize(sensor.B64X64)                  # 分辨率為B64X64
  24.     sensor.skip_frames(time=2000)
  25.     sensor.set_auto_gain(False)                         # 顏色追蹤關閉自動增益
  26.     sensor.set_auto_whitebal(False)                     # 顏色追蹤關閉白平衡

  27. init_sensor()
  28. #--------------感光芯片配置  END -------------------



  29. #--------------定時器部分 START -------------------

  30. is_need_send_data = False # 是否需要發送數據的信號標志
  31. def uart_time_trigger(timer):
  32.     '''
  33.     串口發送數據的定時器,定時器的回調函數
  34.     '''
  35.     global is_need_send_data
  36.     is_need_send_data = True

  37. # 初始化定時器 頻率為20HZ 每秒執行20次
  38. tim = Timer(4, freq=20)
  39. # 設定定時器的回調函數
  40. tim.callback(uart_time_trigger)
  41. #--------------定時器部分 END -------------------


  42. #--------------直線與直角檢測部分 START -------------------

  43. INTERSERCT_ANGLE_THRESHOLD = (45,90)

  44. # 直線灰度圖顏色閾值
  45. LINE_COLOR_THRESHOLD = [(0, 120)]
  46. # 如果直線是白色的,閾值修改為:
  47. # LINE_COLOR_THRESHOLD = [(128, 255)]

  48. # 取樣窗口
  49. ROIS = {
  50.     'down': (0, 55, 64, 8), # 橫向取樣-下方 1
  51.     'middle': (0, 28, 64, 8), # 橫向取樣-中間 2
  52.     'up': (0, 0, 64, 8), # 橫向取樣-上方 3
  53.     'left': (0, 0, 8, 64), # 縱向取樣-左側 4
  54.     'right': (56, 0, 8, 64) # 縱向取樣-右側 5
  55. }


  56. BLOB_MAX_WIDTH = 15 # 色塊的最大寬度
  57. BLOB_MIN_WIDTH = 5 # 色塊的最小寬度
  58. BLOB_MAX_HEIGHT = 15 # 色塊的最大高度
  59. BLOB_MIN_HEIGHT = 5 # 色塊的最小寬度


  60. def find_blobs_in_rois(img):
  61.     '''
  62.     在ROIS中尋找色塊,獲取ROI中色塊的中心區域與是否有色塊的信息
  63.     '''
  64.     global ROIS
  65.     global is_debug

  66.     roi_blobs_result = {}  # 在各個ROI中尋找色塊的結果記錄
  67.     for roi_direct in ROIS.keys():
  68.         roi_blobs_result[roi_direct] = {
  69.             'cx': -1,
  70.             'cy': -1,
  71.             'blob_flag': False
  72.         }
  73.     for roi_direct, roi in ROIS.items():
  74.         blobs=img.find_blobs(LINE_COLOR_THRESHOLD, roi=roi, merge=True, pixels_area=10)
  75.         if len(blobs) == 0:
  76.             continue

  77.         largest_blob = max(blobs, key=lambda b: b.pixels())
  78.         x,y,width,height = largest_blob[:4]

  79.         if not(width >= BLOB_MIN_WIDTH and width <= BLOB_MAX_WIDTH and height >= BLOB_MIN_HEIGHT and height <= BLOB_MAX_HEIGHT):
  80.             # 根據色塊的寬度進行過濾
  81.             continue

  82.         roi_blobs_result[roi_direct]['cx'] = largest_blob.cx()
  83.         roi_blobs_result[roi_direct]['cy'] = largest_blob.cy()
  84.         roi_blobs_result[roi_direct]['blob_flag'] = True

  85.         if is_debug:
  86.             img.draw_rectangle((x,y,width, height), color=(255))

  87.     return roi_blobs_result

  88. def visualize_result(canvas, cx_mean, cx, cy, is_turn_left, is_turn_right, is_t, is_cross):
  89.     '''
  90.     可視化結果
  91.     '''
  92.     if not(is_turn_left or is_turn_right or is_t or is_cross):
  93.         mid_x = int(canvas.width()/2)
  94.         mid_y = int(canvas.height()/2)
  95.         # 繪制x的均值點
  96.         canvas.draw_circle(int(cx_mean), mid_y, 5, color=(255))
  97.         # 繪制屏幕中心點
  98.         canvas.draw_circle(mid_x, mid_y, 8, color=(0))
  99.         canvas.draw_line((mid_x, mid_y, int(cx_mean), mid_y), color=(255))

  100.     turn_type = 'N' # 啥轉角也不是

  101.     if is_t or is_cross:
  102.         # 十字形或者T形
  103.         canvas.draw_cross(int(cx), int(cy), size=10, color=(255))
  104.         canvas.draw_circle(int(cx), int(cy), 5, color=(255))

  105.     if is_t:
  106.         turn_type = 'T' # T字形狀
  107.     elif is_cross:
  108.         turn_type = 'C' # 十字形
  109.     elif is_turn_left:
  110.         turn_type = 'L' # 左轉
  111.     elif is_turn_right:
  112.         turn_type = 'R' # 右轉

  113.     canvas.draw_string(0, 0, turn_type, color=(0))




  114. #--------------直線與直角檢測部分 END -------------------


  115. #---------------------MAIN-----------------------
  116. last_cx = 0
  117. last_cy = 0

  118. while True:
  119.     if not is_need_send_data:
  120.         # 不需要發送數據
  121.         continue
  122.     is_need_send_data = False

  123.     # 拍攝圖片
  124.     img = sensor.snapshot()
  125.     # 去除圖像畸變
  126.     img.lens_corr(DISTORTION_FACTOR)
  127.     # 創建畫布
  128.     # canvas = img.copy()
  129.     # 為了IDE顯示方便,直接在代碼結尾 用IMG繪制

  130.     # 注意:林林的代碼里 計算直線之間的交點的代碼沒有用到
  131.     lines = img.find_lines(threshold=1000, theta_margin = 50, rho_margin = 50)
  132.     # 尋找相交的點 要求滿足角度閾值
  133.     intersect_pt = GeometryFeature.find_interserct_lines(lines, angle_threshold=(45,90), window_size=(IMG_WIDTH, IMG_HEIGHT))
  134.     if intersect_pt is None:
  135.         # 直線與直線之間的夾角不滿足閾值范圍
  136.         intersect_x = 0
  137.         intersect_y = 0
  138.     else:
  139.         intersect_x, intersect_y = intersect_pt

  140.     reslut = find_blobs_in_rois(img)

  141.     # 判斷是否需要左轉與右轉
  142.     is_turn_left = False
  143.     is_turn_right = False


  144.     if (not reslut['up']['blob_flag'] ) and reslut['down']['blob_flag']:
  145.         if reslut['left']['blob_flag']:
  146.             is_turn_left = True
  147.         if reslut['right']['blob_flag']:
  148.             is_turn_right = True


  149.     # 判斷是否為T形的軌道
  150.     is_t = False
  151.     # 判斷是否十字形軌道
  152.     is_cross = False

  153.     cnt = 0
  154.     for roi_direct in ['up', 'down', 'left', 'right']:
  155.         if reslut[roi_direct]['blob_flag']:
  156.             cnt += 1
  157.     is_t = cnt == 3
  158.     is_cross = cnt == 4

  159.     # cx_mean 用于確定視角中的軌道中心
  160.     # 用于表示左右偏移量
  161.     cx_mean = 0
  162.     for roi_direct in ['up', 'down', 'middle']:
  163.         if reslut[roi_direct]['blob_flag']:
  164.             cx_mean += reslut[roi_direct]['cx']
  165.         else:
  166.             cx_mean += IMG_WIDTH / 2
  167.     cx_mean /= 3

  168.     # cx, cy 只有在T形區域檢測出來的時候才有用,
  169.     # 用于確定軌道中圓形的大致區域, 用于定點, 是計算圓心的一種近似方法

  170.     cx = 0
  171.     cy = 0

  172.     if is_cross or is_t:
  173.         # 只在出現十字形或者T字形才計算圓心坐標
  174.         cnt = 0
  175.         for roi_direct in ['up', 'down']:
  176.             if reslut[roi_direct]['blob_flag']:
  177.                 cnt += 1
  178.                 cx += reslut[roi_direct]['cx']
  179.         if cnt == 0:
  180.             cx = last_cx
  181.         else:
  182.             cx /= cnt

  183.         cnt = 0
  184.         for roi_direct in ['left', 'right']:
  185.             if reslut[roi_direct]['blob_flag']:
  186.                 cnt += 1
  187.                 cy += reslut[roi_direct]['cy']
  188.         if cnt == 0:
  189.             cy = last_cy
  190.         else:
  191.             cy /= cnt


  192.     last_cx = cx
  193.     last_cy = cy

  194.     if is_debug:
  195.         visualize_result(img, cx_mean, cx, cy, is_turn_left, is_turn_right, is_t, is_cross)
復制代碼

所有資料51hei提供下載:
源代碼.rar (7.31 KB, 下載次數: 160)


回復

使用道具 舉報

ID:511477 發表于 2019-4-14 20:26 | 顯示全部樓層
感謝樓主,正在做整個邊緣的識別,希望能有所啟發。
回復

使用道具 舉報

ID:138247 發表于 2019-4-29 13:24 | 顯示全部樓層

感謝樓主分享。。。
回復

使用道具 舉報

ID:255974 發表于 2019-5-13 16:38 | 顯示全部樓層
GeometryFeature
這個庫沒有找到,是在哪里呢?
回復

使用道具 舉報

5#
無效樓層,該帖已經被刪除
ID:277400 發表于 2019-5-23 21:02 | 顯示全部樓層
感謝樓主
回復

使用道具 舉報

ID:581887 發表于 2019-7-30 14:29 | 顯示全部樓層
有無詳細介紹
回復

使用道具 舉報

ID:527456 發表于 2019-10-7 08:49 | 顯示全部樓層
plj213 發表于 2019-4-29 13:24
感謝樓主分享。。。

請問這個你知道了嗎?
回復

使用道具 舉報

ID:712457 發表于 2020-4-21 09:47 | 顯示全部樓層
逍遙捷 發表于 2019-5-13 16:38
GeometryFeature
這個庫沒有找到,是在哪里呢?

下載樓主提供的附件壓縮文件
回復

使用道具 舉報

10#
無效樓層,該帖已經被刪除
11#
無效樓層,該帖已經被刪除
ID:1038167 發表于 2022-7-3 17:23 | 顯示全部樓層
感謝樓主,正在做相關十字檢測
回復

使用道具 舉報

13#
無效樓層,該帖已經被刪除
ID:1066253 發表于 2023-3-13 17:27 | 顯示全部樓層
感謝樓主、
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表