久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1517|回復: 0
打印 上一主題 下一主題
收起左側

python+opencv識別紅燈

[復制鏈接]
跳轉到指定樓層
樓主
ID:704010 發表于 2020-3-7 13:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
# -*- coding: utf-8 -*-

#width = 256, 192
#YSU1100W fast-straight
#YSU1000W fast-left
#YSU0100W fast-right
#YSU1101W slow-s
#YSU1001W s-l
#YSU0101W s-r
#YSU0010W find


import numpy as np     
import cv2
import serial
import time



#設定紅色閾值,HSV空間  
redLower = np.array([0, 0, 230])  
redUpper = np.array([10, 255, 237])  
#初始化質心
center = 0
#初始化串口
ser = serial.Serial("/dev/ttyUSB0",9600)
# s = 0
#打開攝像頭
camera = cv2.VideoCapture(0)
camera.set(3, 320)
camera.set(4, 240)   
#遍歷每一幀,檢測信標燈  
while True:
    # s = ser.read(8)
    # # 如果讀到單片機傳過來的信號,倒車
    # if s:
    #     ser.write("YSU0000W".encode())
    #     print("back")
    #     time.sleep(3)
    #     s = 0  
    #讀取幀  
    (ret, frame) = camera.read()  
    #判斷是否成功打開攝像頭  
    if not ret:  
        # print ('No Camera')
        break  
    #轉到HSV空間  
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)  
    #根據閾值構建掩膜 黑白 亮的為閾值內區域
    mask = cv2.inRange(hsv, redLower, redUpper)  
    #腐蝕操作  iterations:迭代次數
    mask = cv2.erode(mask, None, iterations=1)  
    #膨脹操作,其實先腐蝕再膨脹的效果是開運算,去除噪點  
    mask = cv2.dilate(mask, None, iterations=14)  

    #根據灰度值化為二值圖
    # GrayImage=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  
    # ret, gray=cv2.threshold(GrayImage, 230, 255, cv2.THRESH_BINARY)
    #把紅色分的二值圖和灰度二值圖疊加
    # andout = cv2.bitwise_and(mask, gray)

    #檢測尋找輪廓 cv2.RETR_EXTERNAL 只得到最外面的輪廓  
    #cv2.findContours()  opencv3會返回三個值,分別是img, countours, hierarchy
    cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]  
    #初始化圓形輪廓質心  
    center = None  
    #如果存在輪廓  
    if len(cnts) > 0:  
        #找到面積最大的輪廓  
        c = max(cnts, key = cv2.contourArea)  
        #確定面積最大的輪廓的最小外接圓  
        ((x, y), radius) = cv2.minEnclosingCircle(c)  
        #計算輪廓的矩  
        M = cv2.moments(c)  
        #計算質心
        try:  
            center = (int(M["m10"]/M["m00"]), int(M["m01"]/M["m00"]))   
        except:
            continue
        #只有當半徑大于1時,才執行  
        if radius >= 1:
            #畫輪廓圓:img,center,radius,color 厚度:負值就是實心
            cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 1)  
            #在質心中間畫半徑為5的點
            cv2.circle(frame, center, 5, (0, 0, 255), -1)  
            #最關鍵的值pos,相對于畫面中心的x方向像素差  
            pos = center[0]-160
            # print("x=%s"%pos)
            # print(radius)

            try:
                #通過x坐標控制串口
                # if radius >= 60:
                #     t = 0
                #     while True:
                #         t += 0.05
                #         if t >= 0.4:
                #             break
                #         ser.write("YSU1101W".encode())
                #         time.sleep(0.05)
                #減速 拐角大
                if radius >= 100:
                    #向左轉
                    if pos < -50:
                        ser.write("YSU1001W".encode())
                    #直線
                    elif -50 <= pos <= 50:
                        ser.write("YSU1101W".encode())
                    #向右轉
                    else:
                        ser.write("YSU0101W".encode())

                # 正常速度,拐角大
                elif 50 <= radius < 100:
                    if pos < -45:
                        ser.write("YSU0001W".encode())
                    elif -45 <= pos <= 45:
                        ser.write("YSU1100W".encode())
                    else:
                        ser.write("YSU0110W".encode())

                #正常速度,拐角小
                else:
                     #向左轉
                    if pos < -30:
                        ser.write("YSU1000W".encode())
                    #直線
                    elif - 30<= pos <= 30:
                        ser.write("YSU1100W".encode())
                    #向右轉
                    else:
                        ser.write("YSU0100W".encode())
            except:
                continue
        else:
           ser.write("YSU0010W".encode())

    else:
        ser.write("YSU0010W".encode())


    #cv2.imshow('Frame', frame)  
    #鍵盤檢測,檢測到esc鍵退出  
    k = cv2.waitKey(1)&0xFF  
    if k == 27:  
        break  

#攝像頭釋放  
camera.release()  
#銷毀所有窗口  
# cv2.destroyAllWindows()


#關閉串口
ser.close()

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色综合网站 | 久久精品视频在线播放 | 亚洲免费在线 | 欧美 日韩 中文 | 九九视频在线观看 | 日韩视频精品 | 中文一区| 久久精品久久久久久 | 午夜亚洲| 久久综合一区二区 | 欧美精品1区2区 | 国产精品成人av | 亚洲成av人片在线观看无码 | 精品亚洲视频在线 | 青草久久免费视频 | 国产91亚洲精品一区二区三区 | 日韩成人在线播放 | 一级片免费观看 | 欧美操操操 | 国精产品一品二品国精在线观看 | 欧美另类视频 | 福利成人| 天天爽天天操 | 春色av| 成人在线国产 | 久久久蜜桃一区二区人 | 中文字幕在线免费视频 | 日本视频免费 | 国产成人一区二区三区精 | 色综合视频 | 亚洲视频中文字幕 | 2021天天干夜夜爽 | 一区在线观看 | 黄色三级免费网站 | 亚洲最大av | 中文字幕一区在线观看视频 | 欧美激情a∨在线视频播放 成人免费共享视频 | 亚洲一二三区免费 | 国产一区二区在线免费 | 国产精久久久久久 | 久久国产精品久久久久久 |