以下代码所需颜色的形状和质心

shape and centroid of desired color for following code

我是 初学者opencv python。我正在尝试在此代码上检测形状以及彩色对象(颜色范围内检测到的对象)的质心。 请帮助。提前致谢。

代码:

#!/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()

:
code:

` #!/usr/bin/env python

-- 编码:utf-8 --

导入 cv2,数学 将 numpy 导入为 np

class 颜色追踪器: def init(self): 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

if name == "main": colour_tracker = 颜色追踪器() colour_tracker.run()`'