Python 线路跟踪过程中的颜色检测

Python 线路跟踪过程中的颜色检测,python,algorithm,opencv,image-processing,Python,Algorithm,Opencv,Image Processing,我在一个直线跟随机器人上工作,它在白色背景上跟随黑线。代码是这样的 import numpy as np import cv2 cap = cv2.VideoCapture(0) try: while(1): ## Read the image ret, img = cap.read() #cv2.imshow('image',img) img = img[160:320,:,:] gray = cv2.c

我在一个直线跟随机器人上工作,它在白色背景上跟随黑线。代码是这样的

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
try:
    while(1):
        ## Read the image
        ret, img = cap.read()
        #cv2.imshow('image',img)
        img = img[160:320,:,:]

        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        ret,thresh = cv2.threshold(gray,170,255,cv2.THRESH_BINARY_INV)
        #Applying Dilation Morphological Operation To Dilate the image 
        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
        dilation = cv2.dilate(thresh, kernel, iterations = 5)    
        #Apllying Gaussian Bluring Algorithm to reduce the number of contours
        blur3 = cv2.medianBlur (dilation,5)
        i = 0
        contours, hierarchy = cv2.findContours(blur3,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
        cv2.drawContours(img,contours,-1,(0,255,0),3)
        cv2.imshow('image',img)

        M = cv2.moments(contours[i])
        cx = int(M['m10']/M['m00'])
        cy = int(M['m01']/M['m00'])


        if cx < 190:                                 
               print "LEFT"
        if cx > 450:
              print "RIGHT "                    
       if ((cx > 189) & (cx < 449)):
              print "FRONT"
finally:
            cap.release()
    cv2.destroyAllWindows()
将numpy导入为np
进口cv2
cap=cv2.视频捕获(0)
尝试:
而(一):
##阅读图片
ret,img=cap.read()
#cv2.imshow(“图像”,img)
img=img[160:320,:,:]
灰色=cv2.CVT颜色(img,cv2.COLOR\U BGR2GRAY)
ret,thresh=cv2.阈值(灰色,170255,cv2.thresh\u二进制\u INV)
#应用扩张形态学运算对图像进行扩张
kernel=cv2.getStructuringElement(cv2.morp_ELLIPSE,(3,3))
扩张=cv2。扩张(阈值,核,迭代次数=5)
#应用高斯模糊算法减少轮廓数
blur3=cv2.medianBlur(扩张,5)
i=0
等高线,层次=cv2.findContours(模糊3,cv2.RETR\u树,cv2.CHAIN\u近似\u简单)
cv2.等高线图(img,等高线-1,(0255,0),3)
cv2.imshow(“图像”,img)
M=cv2.力矩(等高线[i])
cx=int(M['m10']/M['m00']
cy=int(M['m01']/M['m00']
如果cx<190:
打印“左”
如果cx>450:
打印“右”
如果((cx>189)和(cx<449)):
打印“正面”
最后:
第1章释放()
cv2.destroyAllWindows()
我还想检测蓝色和红色,而机器人是在使用相同的相机线

我试着读取质心的中心像素
center\u px=img[cy,cx]

但是仅仅读取一个像素就可以有效地确定颜色

那么,还有其他方法可以做到这一点吗


我正在使用python2.7和cv2

您确定了质心,为什么不使用它呢?你对“不高效”的理解是什么?在图像处理中,没有什么比访问单个像素更有效的了。质心没有中心像素btw。。质心通常是以亚像素精度给出的坐标,它位于多达4个像素之间。您可以通过以下方式获得质心的强度/颜色值:interpolation@Piglet我同意质心的bgr值,但该值会随着房间内光线强度的变化而变化。如果您只对颜色感兴趣,那么如果颜色像红色一样变亮或变暗,应该不会有问题导致红色值高于蓝色值,反之亦然。您还可以使用HSI值并检查色调值,以确定您是否位于红色或蓝色标记之上。只要你还没有饱和,强度的变化就不重要了