opencv黑白线循迹
生活随笔
收集整理的這篇文章主要介紹了
opencv黑白线循迹
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
import cv2 as cv
import numpy as np
import timedef xunji():cap = cv.VideoCapture(0, cv.CAP_DSHOW)cap.set(3, 600)cap.set(4, 600)if cap.isOpened():while 1:ret, frame = cap.read()res = cv.resize(frame, None, fx=0.5, fy=0.5)cv.imshow("res", res)# 顏色空間轉(zhuǎn)換res1 = cv.cvtColor(res, cv.COLOR_BGR2GRAY)res2 = cv.cvtColor(res, cv.COLOR_BGR2HSV)# 圖像閾值設(shè)置ret0, thresh1 = cv.threshold(res1, 80, 255, cv.THRESH_BINARY)# 高斯濾波blur = cv.medianBlur(thresh1, 5)# 形態(tài)學(xué)運(yùn)算kernel = np.ones((5, 5), np.uint8)cvOpen = cv.morphologyEx(blur, cv.MORPH_OPEN, kernel) # 開運(yùn)算cv.imshow("cvOpen", cvOpen)# kirsch算子m1 = np.array([[5, 5, 5], [-3, 0, -3], [-3, -3, -3]])m2 = np.array([[-3, 5, 5], [-3, 0, 5], [-3, -3, -3]])m3 = np.array([[-3, -3, 5], [-3, 0, 5], [-3, -3, 5]])m4 = np.array([[-3, -3, -3], [-3, 0, 5], [-3, 5, 5]])m5 = np.array([[-3, -3, -3], [-3, 0, -3], [5, 5, 5]])m6 = np.array([[-3, -3, -3], [5, 0, -3], [5, 5, -3]])m7 = np.array([[5, -3, -3], [5, 0, -3], [5, -3, -3]])m8 = np.array([[5, 5, -3], [5, 0, -3], [-3, -3, -3]])filterlist = [m1, m2, m3, m4, m5, m6, m7, m8] # 將各個(gè)方向的卷積核放到一起便于統(tǒng)一操作filtered_list = np.zeros((8, cvOpen.shape[0], cvOpen.shape[1])) # 建立三維數(shù)組,第0維表示各個(gè)方向卷積后的值for k in range(8):out = cv.filter2D(cvOpen, cv.CV_16S, filterlist[k]) # 自定義卷積,其實(shí)里面的步驟跟Sobel算子是差不多的filtered_list[k] = outfinal = np.max(filtered_list, axis=0) # 取八個(gè)方向中的最大值,也就是取第0維的最大值作為圖像該點(diǎn),濾波之后的新的像素值final[np.where(final >= 255)] = 255 # 令像素值大于255的點(diǎn)等于255final[np.where(final < 255)] = 0 # 令像素值小于255的點(diǎn)等于0cv.imshow("final", final)# 判斷try:m = []w = []p = []height = int(final.shape[0])width = int(final.shape[1])i = 0while i < height-1:n = []if len(m) < 20:for j in range(10, width-1):if final[i, j] == final[i, j+1] and final[i, j+1] == 0:j += 2elif final[i, j] != final[i, j+1] and final[i, j + 1] == 255:n.append(j+1)# print(n)if len(n) != 0:w.append(n)m.append(len(n))i += 2a = 0t = 1for k in range(len(m)):if m[k] == 0:p.append(0)if m[k] == 1:p.append((2*w[k][0] + 40)/2)if m[k] == 2:p.append((w[k][0] + w[k][1])/2)if m[k] == 3:p.append((w[k][0] + 40)/2)# if 60 < sum(m) <= 80 and a == 0:# if t == 1:# p.append((w[k][0] + w[k][1]) / 2)# elif t == 2:# p.append((w[k][3] + w[k][2]) / 2)# elif t == 3:# p.append((w[k][0] + w[k][1]) / 2)# elif t == 4:# p.append((w[k][0] + w[k][1]) / 2)# a = 1# elif m[k] == 2 and a:# t += 1# a = 0p.remove(max(p))p.remove(min(p))print("距離中心:%.2f" %(165-sum(p)/(len(p)-1)))except Exception as e:print(e)low_yellow = np.array([26, 43, 46])high_yellow = np.array([34, 255, 255])mask = cv.inRange(res2, low_yellow, high_yellow)open = cv.morphologyEx(mask, cv.MORPH_OPEN, kernel)edges = cv.Canny(open, 10, 20)cnts, _ = cv.findContours(edges, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)if len(cnts) > 0:breakcv.imshow("mask", edges)if cv.waitKey(1) == ord('q'):breakcap.release()cv.destroyAllWindows()if __name__ == "__main__":xunji()
總結(jié)
以上是生活随笔為你收集整理的opencv黑白线循迹的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: halcon 粘连物体分割
- 下一篇: 没撑过2020,我从外包公司离职了