Python 图像颜色检测

Python 图像颜色检测,python,opencv,Python,Opencv,我试着检测三种颜色:蓝色、黄色和粉色 蓝色和黄色很好用,但粉红色不行,我不知道为什么 但我认为这方面的问题 cv.Lineimdraw,粉色[0],粉色[1],0255,0,3,8,0 有人能帮我吗 import cv global imghsv import Adafruit_BBIO.GPIO as GPIO GPIO.setup("P8_11", GPIO.OUT) GPIO.setup("P8_12", GPIO.OUT) GPIO.setup("P8_13", GPIO.OUT)

我试着检测三种颜色:蓝色、黄色和粉色 蓝色和黄色很好用,但粉红色不行,我不知道为什么 但我认为这方面的问题 cv.Lineimdraw,粉色[0],粉色[1],0255,0,3,8,0 有人能帮我吗

import cv
global imghsv
import Adafruit_BBIO.GPIO as GPIO

GPIO.setup("P8_11", GPIO.OUT)
GPIO.setup("P8_12", GPIO.OUT)
GPIO.setup("P8_13", GPIO.OUT)

def getthresholdedimg(im):

    '''this function take RGB image.Then convert it into HSV for easy colour detection and threshold it with yellow and blue part as white and all other regions as black.Then return that image'''
    global imghsv
    imghsv=cv.CreateImage(cv.GetSize(im),8,3)
    cv.CvtColor(im,imghsv,cv.CV_BGR2HSV)                # Convert image from RGB to HSV

    # A little change here. Creates images for blue and yellow (or whatever color you like).
    imgyellow=cv.CreateImage(cv.GetSize(im),8,1)
    imgblue=cv.CreateImage(cv.GetSize(im),8,1)
        imgpink=cv.CreateImage(cv.GetSize(im),8,1)

    imgthreshold=cv.CreateImage(cv.GetSize(im),8,1)

    cv.InRangeS(imghsv,cv.Scalar(20,100,100),cv.Scalar(30,255,255),imgyellow)   # Select a range of orange color
    cv.InRangeS(imghsv,cv.Scalar(100,100,100),cv.Scalar(120,255,255),imgblue)   # Select a range of blue color
    cv.InRangeS(imghsv,cv.Scalar(10,100,100),cv.Scalar(11,255,255),imgpink) # Select a range of pink color
        cv.Add(imgyellow,imgblue,imgthreshold)
    return imgthreshold

capture=cv.CaptureFromCAM(0)
frame = cv.QueryFrame(capture)
frame_size = cv.GetSize(frame)
test=cv.CreateImage(cv.GetSize(frame),8,3)
img2=cv.CreateImage(cv.GetSize(frame),8,3)
cv.NamedWindow("Real",0)
cv.NamedWindow("Threshold",0)
cv.NamedWindow("final",0)

#   Create two lists to store co-ordinates of blobs
blue=[]
yellow=[]
pink=[]

while(1):
    color_image = cv.QueryFrame(capture)
    imdraw=cv.CreateImage(cv.GetSize(frame),8,3)
    cv.SetZero(imdraw)
    cv.Flip(color_image,color_image,1)
    cv.Smooth(color_image, color_image, cv.CV_GAUSSIAN, 3, 0)
    imgyellowthresh=getthresholdedimg(color_image)
    cv.Erode(imgyellowthresh,imgyellowthresh,None,3)
    cv.Dilate(imgyellowthresh,imgyellowthresh,None,10)
    img2=cv.CloneImage(imgyellowthresh)
    storage = cv.CreateMemStorage(0)
    contour = cv.FindContours(imgyellowthresh, storage, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE)
    points = [] 

#   This is the new part here. ie Use of cv.BoundingRect()
    while contour:
        # Draw bounding rectangles
        bound_rect = cv.BoundingRect(list(contour))
        contour = contour.h_next()
        print contour
        # for more details about cv.BoundingRect,see documentation
        pt1 = (bound_rect[0], bound_rect[1])
        pt2 = (bound_rect[0] + bound_rect[2], bound_rect[1] + bound_rect[3])
        points.append(pt1)
        points.append(pt2)
        cv.Rectangle(color_image, pt1, pt2, cv.CV_RGB(255,0,0), 1)

    #   Calculating centroids

        centroidx=cv.Round((pt1[0]+pt2[0])/2)
        centroidy=cv.Round((pt1[1]+pt2[1])/2)

    #   Identifying if blue or yellow blobs and adding centroids to corresponding lists 
        if (10<cv.Get2D(imghsv,centroidy,centroidx)[0]<11):
                        GPIO.output("P8_11", GPIO.HIGH)
                        GPIO.output("P8_12", GPIO.LOW)
                        GPIO.output("P8_13", GPIO.LOW)
            yellow.append((centroidx,centroidy))
        elif (100<cv.Get2D(imghsv,centroidy,centroidx)[0]<120):
                        GPIO.output("P8_11", GPIO.LOW)
                        GPIO.output("P8_12", GPIO.HIGH)
                        GPIO.output("P8_13", GPIO.LOW)
            blue.append((centroidx,centroidy))
        elif (10<cv.Get2D(imghsv,centroidy,centroidx)[0]<11):
                        GPIO.output("P8_11", GPIO.LOW)
                        GPIO.output("P8_12", GPIO.LOW)
                        GPIO.output("P8_13", GPIO.HIGH)
            blue.append((centroidx,centroidy))

#       Now drawing part. Exceptional handling is used to avoid IndexError. After drawing is over, centroid from previous part is #     removed from list by pop. So in next frame,centroids in this frame become initial points of line to draw.       
    try:
        cv.Circle(imdraw,yellow[1],5,(0,255,255))
        cv.Line(imdraw,yellow[0],yellow[1],(0,255,255),3,8,0)

        yellow.pop(0)
    except IndexError:
                GPIO.output("P8_11", GPIO.LOW)
        print "Just wait for yellow"

    try:
        cv.Circle(imdraw,blue[1],5,(255,0,0))
        cv.Line(imdraw,blue[0],blue[1],(255,0,0),3,8,0)
        blue.pop(0)         
    except IndexError:
                GPIO.output("P8_12", GPIO.LOW)
        print "just wait for blue"

        try:
        cv.Circle(imdraw,pink[1],5,(0,255,0))
        cv.Line(imdraw,pink[0],pink[1],(0,255,0),3,8,0)

        yellow.pop(0)
    except IndexError:
                GPIO.output("P8_13", GPIO.LOW)
        print "Just wait for pink"  
    cv.Add(test,imdraw,test)

    cv.ShowImage("Real",color_image)
    cv.ShowImage("Threshold",img2)
    cv.ShowImage("final",test)
    if cv.WaitKey(33)==1048603:
        cv.DestroyWindow("Real")
        cv.DestroyWindow("Threshold")
        cv.DestroyWindow("final")
        break

尝试了解PIL.Image模块并使用getpixelx,y.

尝试了解PIL.Image模块并使用getpixelx,y.

尝试将您发布的代码减少到最少的示例。无论如何,似乎格式已经损坏,有一个try:语句没有正文。请尝试将您发布的代码减少到最少的示例。无论如何,似乎格式已损坏,有一个try:语句没有正文。当我键入import image时,它会给我一个错误:import image Traceback最近的调用last:File,第1行,在ImportError中:没有名为的模块Image@user3262297尝试导入PIL.image当我键入import image时,它会给我一个错误:import image Traceback最近的调用last:文件,第1行,在ImportError:没有名为的模块Image@user3262297尝试导入PIL.Image