2015-02-09 86 views
-1

im a 初學者opencv python。我試圖檢測此代碼中的形狀以及彩色對象(顏色範圍內的檢測對象)的質心。 請幫助。提前感謝。以下代碼的形狀和所需顏色的質心

CODE:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import cv2, math 
import numpy as np 
class ColourTracker: 
     def __init__(self): 
      cv2.namedWindow("ColourTrackerWindow", cv2.CV_WINDOW_AUTOSIZE) 
      self.capture = cv2.VideoCapture(0) 
      self.scale_down = 4 
     def run(self): 
      while True: 
       f, orig_img = self.capture.read() 
       #orig_img = cv2.flip(orig_img, 1) 
       #img = cv2.GaussianBlur(orig_img, (5,5), 0) 
       #laplacian = cv2.Laplacian(orig_img,cv2.CV_64F) 
       #sobelx = cv2.Sobel(orig_img,cv2.CV_64F,1,0,ksize=5) 
       #sobely = cv2.Sobel(orig_img,cv2.CV_64F,0,1,ksize=5) 
       img = cv2.cvtColor(orig_img, cv2.COLOR_BGR2HSV) 
       img = cv2.resize(img, (len(orig_img[0])/self.scale_down, len(orig_img)/self.scale_down)) 
      boundaries = [([0, 150, 0], [5, 255, 255])]#,([50, 140, 10], [255, 255, 255]),([10, 150, 180], [255, 255, 255])] 
      for (lower, upper) in boundaries: 
        lower = np.array(lower,np.uint8) 
        upper = np.array(upper,np.uint8) 
        binary = cv2.inRange(img, lower, upper) 
        dilation = np.ones((15, 15), "uint8") 
        binary = cv2.dilate(binary, dilation) 
        #edge = cv2.Canny(red_binary,200,300,apertureSize = 3) 
        contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 
        max_area = 0 
        largest_contour = None 
        for idx, contour in enumerate(contours): 
         area = cv2.contourArea(contour) 
         if area > max_area: 
          max_area = area 
          largest_contour = contour 
          for cnt in largest_contour: 
           approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True) 
           print len(approx) 
           if len(approx)==14: 
            print "circle" 
           #cv2.drawContours(orig_img,[cnt], 0, (0, 0, 255), 2) 

        if not largest_contour == None: 
         moment = cv2.moments(largest_contour) 
         if moment["m00"] > 1000/self.scale_down: 
          rect = cv2.minAreaRect(largest_contour) 
          rect = ((rect[0][0] * self.scale_down, rect[0][1] * self.scale_down), (rect[1][0] * self.scale_down, rect[1][1] * self.scale_down), rect[2]) 
          #box = cv2.cv.BoxPoints(rect) 
          #box = np.int0(box) 

           #cv2.drawContours(img,[cnt],0,255,-1) 

          cv2.drawContours(orig_img,[cnt], 0, (0, 0, 255), 2) 
          cv2.imshow("ColourTrackerWindow", orig_img) 
          if cv2.waitKey(20) == 27: 
           cv2.destroyWindow("ColourTrackerWindow") 
           self.capture.release() 
           break 
if __name__ == "__main__": 
    colour_tracker = ColourTracker() 
    colour_tracker.run() 

: 
+1

您有什麼問題,和你做了什麼,試圖修復它? – HavelTheGreat 2015-02-09 16:22:15

+0

我能夠檢測到顏色,但我需要檢測檢測到的物體的形狀。 – 2015-02-09 16:29:35

+0

對於後者,我添加了cv.approxPolyDP,但沒有得到所需的輸出。 – 2015-02-09 16:40:20

回答

0
code: 

`#在/ usr /斌/包膜蟒蛇

- - 編碼:UTF-8 - -

進口CV2,數學 np進口numpy

class ColourTracker: DEF 初始化(個體): cv2.namedWindow( 「ColourTrackerWindow」,cv2.CV_WINDOW_AUTOSIZE) self.capture = cv2.VideoCapture(1) self.scale_down = 4

def run(self): 
    while True: 
     f, orig_img = self.capture.read() 
     #orig_img = cv2.flip(orig_img, 1) 

     img = cv2.GaussianBlur(orig_img, (5,5), 0) 
     img = cv2.cvtColor(orig_img, cv2.COLOR_BGR2HSV) 
     img = cv2.resize(img, (len(orig_img[0])/self.scale_down, len(orig_img)/self.scale_down)) 

     boundaries = [([0, 150, 150], [5, 255, 255]), 
         ([40, 80, 10], [255, 255, 255]), 
         ([190, 150, 100], [255, 255, 255])] 
     for (lower, upper) in boundaries: 
          lower = np.array(lower,np.uint8) 
          upper = np.array(upper,np.uint8) 
          binary = cv2.inRange(img, lower, upper) 
          dilation = np.ones((15, 15), "uint8") 
          binary = cv2.dilate(binary, dilation) 
          canny = cv2.Canny(binary,100,200) 
          contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 

          max_area = 0 
          largest_contour = None 
          for idx, contour in enumerate(contours): 
           area = cv2.contourArea(contour) 
           if area > max_area: 
            max_area = area 
            largest_contour = contour 

          if not largest_contour == None: 
           moment = cv2.moments(largest_contour) 
           if moment["m00"] > 1000/self.scale_down: 
            rect = cv2.minAreaRect(largest_contour) 
            rect = ((rect[0][0] * self.scale_down, rect[0][1] * self.scale_down), (rect[1][0] * self.scale_down, rect[1][1] * self.scale_down), rect[2]) 
            box = cv2.cv.BoxPoints(rect) 
            box = np.int0(box) 
            cv2.drawContours(orig_img,[box], 0, (0, 0, 255), 2) 

            cv2.imshow("ColourTrackerWindow", orig_img) 
            cv2.imshow("SHAPE", canny) 
            if cv2.waitKey(20) == 27: 
             cv2.destroyWindow("ColourTrackerWindow") 
             self.capture.release() 
             break 

如果名稱 == 「主要」: colour_tracker = ColourTracker() colour_tracker.run()'」

+0

添加canny模塊完成這項工作。 – 2015-03-02 17:49:20