最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用python編寫一個視覺巡線程序

 更新時間:2025年01月02日 11:05:14   作者:酷愛碼  
這篇文章主要為大家詳細(xì)介紹了如何使用python編寫一個視覺巡線程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

要寫一個視覺巡線程序,首先需要安裝OpenCV庫來進(jìn)行圖像處理。然后,需要攝像頭或者相機(jī)來獲取視頻流或者圖片。

下面是一個使用OpenCV進(jìn)行視覺巡線的簡單示例程序:

import cv2

def follow_line():
    # 打開攝像頭或者讀取視頻文件
    cap = cv2.VideoCapture(0)  # 參數(shù)0表示打開默認(rèn)攝像頭
    # 設(shè)置視頻流的寬和高
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

    while True:
        # 讀取一幀圖像
        ret, frame = cap.read()
        
        # 進(jìn)行圖像處理,例如灰度化、邊緣檢測等
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        edges = cv2.Canny(gray, 50, 150)
        
        # 在圖像上找到線條或者輪廓
        contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        
        # 遍歷每個輪廓
        for contour in contours:
            # 計(jì)算輪廓的中心坐標(biāo)
            M = cv2.moments(contour)
            if M["m00"] != 0:
                cx = int(M["m10"] / M["m00"])
                cy = int(M["m01"] / M["m00"])
                
                # 在圖像上標(biāo)記出線條的中心點(diǎn)
                cv2.circle(frame, (cx, cy), 5, (0, 255, 0), -1)
        
        # 顯示圖像
        cv2.imshow("Frame", frame)
        
        # 按下Esc鍵退出循環(huán)
        if cv2.waitKey(1) == 27:
            break
    
    # 釋放攝像頭或者關(guān)閉視頻文件
    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    follow_line()

這是一個簡單的巡線程序,它使用Canny邊緣檢測算法來檢測圖像中的線條,然后計(jì)算線條的中心坐標(biāo),并在圖像上標(biāo)記出來。你可以根據(jù)實(shí)際需求進(jìn)行進(jìn)一步的圖像處理和控制機(jī)器人運(yùn)動的操作。

方法補(bǔ)充

除了上文的方法,小編還為大家整理了python實(shí)現(xiàn)視覺SLAM視覺巡線的方法,有需要的可以了解下

1.簡要概述:

通過攝像頭采集圖像,

將圖像灰度化、二值化、膨脹、腐蝕操作后,

提取第400行像素值v,接近于圖像底線位置,

提取中間值(這里為白色)的數(shù)量和位置,

根據(jù)數(shù)量和位置,利用簡單的數(shù)學(xué)公式,(首項(xiàng)+尾項(xiàng))/2,計(jì)算出白色的中間位置,

然后對比實(shí)際的中間位置320(不需要改),計(jì)算出偏移量,

最后根據(jù)偏移量計(jì)算出電機(jī)應(yīng)有的轉(zhuǎn)角。

2.邊緣檢測實(shí)驗(yàn)

#!/usr/bin/env python3

# 識別的是中線為白色

import cv2
import numpy as np

# center定義
center = 320
# 打開攝像頭,圖像尺寸640*480(長*高),opencv存儲值為480*640(行*列)
cap = cv2.VideoCapture(0)
while (1):
    ret, frame = cap.read()
    cv2.imshow("recognize_face", frame)
    # 轉(zhuǎn)化為灰度圖
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow("gray", gray)
    # 大津法二值化
    retval, dst = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
    cv2.imshow("dst", dst)
    # 膨脹,白區(qū)域變大
    dst = cv2.dilate(dst, None, iterations=2)
    cv2.imshow("dst2", dst)
    # # 腐蝕,白區(qū)域變小 #
    dst = cv2.erode(dst, None, iterations=6)
    cv2.imshow("dst3", dst)
    # 單看第400行的像素值v
    color = dst[400]
    try:
        # 找到白色的像素點(diǎn)個數(shù),如尋黑色,則改為0
        white_count = np.sum(color == 255)
        # 找到白色的像素點(diǎn)索引,如尋黑色,則改為0
        white_index = np.where(color == 255)
        # 防止white_count=0的報錯
        if white_count == 0:
            white_count = 1
        # 找到黑色像素的中心點(diǎn)位置
        # 計(jì)算方法應(yīng)該是邊緣檢測,計(jì)算白色邊緣的位置和/2,即是白色的中央位置。
        center = (white_index[0][white_count - 1] + white_index[0][0]) / 2
        # 計(jì)算出center與標(biāo)準(zhǔn)中心點(diǎn)的偏移量,因?yàn)閳D像大小是640,因此標(biāo)準(zhǔn)中心是320,因此320不能改。
        direction = center - 320
        print(direction)
    except:
        continue
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release() #釋放cap
cv2.destroyAllWindows()#銷毀所有窗口

2.樹莓派GPIO應(yīng)用

# coding:utf-8 
# 實(shí)現(xiàn)樹莓派小車的變速控制 
import RPi.GPIO as gpio 
# 定義引腳 
in1 = 12 
in2 = 16 
in3 = 18 
in4 = 22 
# 設(shè)置GPIO口為BOARD編號規(guī)范,從左到右,從上到下。 
gpio.setmode(gpio.BOARD) 
# 設(shè)置GPIO口為輸出 
gpio.setup(in1, gpio.OUT) 
gpio.setup(in2, gpio.OUT) 
gpio.setup(in3, gpio.OUT) 
gpio.setup(in4, gpio.OUT) 
# 設(shè)置PWM波,頻率為500Hz 
pwm1 = gpio.PWM(in1, 500) 
pwm2 = gpio.PWM(in2, 500) 
pwm3 = gpio.PWM(in3, 500) 
pwm4 = gpio.PWM(in4, 500) 
# 初始化 
pwm1.start(0) 
pwm2.start(0) 
pwm3.start(0) 
pwm4.start(0) 
# 定義向前 
def go(): 
    pwm1.ChangeDutyCycle(50) 
    pwm2.ChangeDutyCycle(0) 
    pwm3.ChangeDutyCycle(50) 
    pwm4.ChangeDutyCycle(0) 
# 定義向右 
def right(): 
    pwm1.ChangeDutyCycle(50) 
    pwm2.ChangeDutyCycle(0) 
    pwm3.ChangeDutyCycle(30) 
    pwm4.ChangeDutyCycle(0) 
# 定義向左 
def left(): 
    pwm1.ChangeDutyCycle(30) 
    pwm2.ChangeDutyCycle(0) 
    pwm3.ChangeDutyCycle(50) 
    pwm4.ChangeDutyCycle(0) 
# 定義向后 
def back(): 
    pwm1.ChangeDutyCycle(0) 
    pwm2.ChangeDutyCycle(50) 
    pwm3.ChangeDutyCycle(0) 
    pwm4.ChangeDutyCycle(50) 
# 定義停止 
def stop(): 
    pwm1.ChangeDutyCycle(0) 
    pwm2.ChangeDutyCycle(0) 
    pwm3.ChangeDutyCycle(0) 
    pwm4.ChangeDutyCycle(0) 
pwm1.stop() 
pwm2.stop() 
pwm3.stop() 
pwm4.stop() 
gpio.cleanup()

3.視覺巡線

# coding:utf-8 
# 加入攝像頭模塊,讓小車實(shí)現(xiàn)自動循跡行駛 
# 思路為:攝像頭讀取圖像,進(jìn)行二值化,將白色的賽道凸顯出來 
# 選擇下方的一行像素,黑色為0,白色為255 # 找到白色值的中點(diǎn) 
# 目標(biāo)中點(diǎn)與標(biāo)準(zhǔn)中點(diǎn)(320)進(jìn)行比較得出偏移量 
# 根據(jù)偏移量來控制小車左右輪的轉(zhuǎn)速 
# 考慮了偏移過多失控->停止;偏移量在一定范圍內(nèi)->高速直行(這樣會速度不穩(wěn)定,已刪) 
import RPi.GPIO as gpio 
import time 
import cv2 
import numpy as np 
import serial

ser=serial.Serial('/dev/ttyAMA0',115200,timeout=1)
# 定義引腳 
pin1 = 12 
pin2 = 16 
pin3 = 18 
pin4 = 22 
# 設(shè)置GPIO口為BOARD編號規(guī)范 
gpio.setmode(gpio.BOARD) 
# 設(shè)置GPIO口為輸出 
gpio.setup(pin1, gpio.OUT) 
gpio.setup(pin2, gpio.OUT) 
gpio.setup(pin3, gpio.OUT) 
gpio.setup(pin4, gpio.OUT) 
# 設(shè)置PWM波,頻率為500Hz 
pwm1 = gpio.PWM(pin1, 500) 
pwm2 = gpio.PWM(pin2, 500) 
pwm3 = gpio.PWM(pin3, 500) 
pwm4 = gpio.PWM(pin4, 500) 
# pwm波控制初始化 
pwm1.start(0) 
pwm2.start(0) 
pwm3.start(0) 
pwm4.start(0) 
# center定義 
center = 320 
# 打開攝像頭,圖像尺寸640*480(長*高),opencv存儲值為480*640(行*列) 
cap = cv2.VideoCapture(0) 
while (1): 
    ret, frame = cap.read()
    cv2.imshow("recognize_face", frame) 
    # 轉(zhuǎn)化為灰度圖 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    # 大津法二值化 
    retval, dst = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) 
    # 膨脹,白區(qū)域變大 
    dst = cv2.dilate(dst, None, iterations=2) 
    cv2.imshow("dst", dst)
    # # 腐蝕,白區(qū)域變小 # 
    #dst = cv2.erode(dst, None, iterations=6) 
    # 單看第400行的像素值s 
    color = dst[400] 
    try:
        # 找到白色的像素點(diǎn)個數(shù),如尋黑色,則改為0
        white_count = np.sum(color == 255)
        # 找到白色的像素點(diǎn)索引,如尋黑色,則改為0
        white_index = np.where(color == 255)
        # 防止white_count=0的報錯
        if white_count == 0:
            white_count = 1
        # 找到黑色像素的中心點(diǎn)位置
        # 計(jì)算方法應(yīng)該是邊緣檢測,計(jì)算白色邊緣的位置和/2,即是白色的中央位置。
        center = (white_index[0][white_count - 1] + white_index[0][0]) / 2
        # 計(jì)算出center與標(biāo)準(zhǔn)中心點(diǎn)的偏移量,因?yàn)閳D像大小是640,因此標(biāo)準(zhǔn)中心是320,因此320不能改。
        direction = center - 320
        print(direction)
        ser.write(direction)
    except:
        continue

    # 停止 
    if abs(direction) > 250: 
        pwm1.ChangeDutyCycle(0) 
        pwm2.ChangeDutyCycle(0) 
        pwm3.ChangeDutyCycle(0) 
        pwm4.ChangeDutyCycle(0) 
    # 右轉(zhuǎn) 
    elif direction >= 0: 
        # 限制在70以內(nèi) 
        if direction > 70: 
            direction = 70 
        pwm1.ChangeDutyCycle(30 + direction) 
        pwm2.ChangeDutyCycle(0) 
        pwm3.ChangeDutyCycle(30) 
        pwm4.ChangeDutyCycle(0) 
    # 左轉(zhuǎn) 
    elif direction < -0: 
        if direction < -70: 
            direction = -70 
        pwm1.ChangeDutyCycle(30) 
        pwm2.ChangeDutyCycle(0) 
        pwm3.ChangeDutyCycle(30 - direction) 
        pwm4.ChangeDutyCycle(0) 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
        break 
# 釋放清理 
cap.release() 
cv2.destroyAllWindows() 
pwm1.stop() 
pwm2.stop() 
pwm3.stop() 
pwm4.stop() 
gpio.cleanup()

到此這篇關(guān)于使用python編寫一個視覺巡線程序的文章就介紹到這了,更多相關(guān)python視覺巡線內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 6個Python辦公黑科技,助你提升工作效率

    6個Python辦公黑科技,助你提升工作效率

    這篇文章主要介紹了Python辦公黑科技,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-08-08
  • python psutil 模塊概述及使用示例

    python psutil 模塊概述及使用示例

    psutil是一個跨平臺的Python庫,用于系統(tǒng)監(jiān)控、性能分析和進(jìn)程管理,它提供了豐富的API,可用于獲取系統(tǒng)的CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等資源的使用情況,以及進(jìn)行進(jìn)程管理,psutil支持Linux、Windows、macOS等主流操作系統(tǒng)
    2024-11-11
  • Python標(biāo)準(zhǔn)庫shutil模塊使用方法解析

    Python標(biāo)準(zhǔn)庫shutil模塊使用方法解析

    這篇文章主要介紹了Python標(biāo)準(zhǔn)庫shutil模塊使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • python數(shù)據(jù)結(jié)構(gòu)之二叉樹的統(tǒng)計(jì)與轉(zhuǎn)換實(shí)例

    python數(shù)據(jù)結(jié)構(gòu)之二叉樹的統(tǒng)計(jì)與轉(zhuǎn)換實(shí)例

    這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)之二叉樹的統(tǒng)計(jì)與轉(zhuǎn)換實(shí)例,例如統(tǒng)計(jì)二叉樹的葉子、分支節(jié)點(diǎn),以及二叉樹的左右兩樹互換等,需要的朋友可以參考下
    2014-04-04
  • 通過python獲取甲流分布數(shù)據(jù)

    通過python獲取甲流分布數(shù)據(jù)

    近期,多地學(xué)校出現(xiàn)因甲流導(dǎo)致的班級停課,兒科甲流患者就診量呈數(shù)倍增長,今天我們同樣的操作來獲取下現(xiàn)在甲流感染的數(shù)據(jù),需要的朋友可以參考下
    2023-03-03
  • Python 打印中文字符的三種方法

    Python 打印中文字符的三種方法

    本文給大家分享三種方法實(shí)現(xiàn)python打印中文字符的方法,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-08-08
  • python 通過郵件控制實(shí)現(xiàn)遠(yuǎn)程控制電腦操作

    python 通過郵件控制實(shí)現(xiàn)遠(yuǎn)程控制電腦操作

    這篇文章主要介紹了python 通過郵件控制電腦實(shí)現(xiàn)遠(yuǎn)程控制操作,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • python多個字符串條件分割split方式

    python多個字符串條件分割split方式

    這篇文章主要介紹了python多個字符串條件分割split方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 用python實(shí)現(xiàn)各種數(shù)據(jù)結(jié)構(gòu)

    用python實(shí)現(xiàn)各種數(shù)據(jù)結(jié)構(gòu)

    這篇文章主要分享的是用python實(shí)現(xiàn)各種數(shù)據(jù)結(jié)構(gòu),快速排序、選擇排序、插入排序、歸并排序、堆排序heapq模塊等相關(guān)資料,感興趣的小伙伴可以參考一下
    2021-12-12
  • tensorflow實(shí)現(xiàn)簡單的卷積網(wǎng)絡(luò)

    tensorflow實(shí)現(xiàn)簡單的卷積網(wǎng)絡(luò)

    這篇文章主要為大家詳細(xì)介紹了tensorflow實(shí)現(xiàn)簡單的卷積網(wǎng)絡(luò),使用的數(shù)據(jù)集是MNIST,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評論

宝清县| 中阳县| 安图县| 广宁县| 大石桥市| 湛江市| 静海县| 香港| 环江| 青阳县| 宁安市| 大石桥市| 衢州市| 肇源县| 林西县| 大同市| 通道| 工布江达县| 崇明县| 阿拉善左旗| 兴安县| 彰化市| 巴里| 南安市| 鲜城| 汉阴县| 灵山县| 临澧县| 东海县| 油尖旺区| 闽侯县| 西乡县| 望江县| 湟中县| 古蔺县| 绥化市| 泽库县| 湖州市| 比如县| 五常市| 安乡县|