public
Description: A collection of object-oriented Python wrappers for OpenCV
Homepage:
Clone URL: git://github.com/cv/opencv-wrappers.git
opencv-wrappers / color_filtering.py
100644 129 lines (96 sloc) 3.443 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
from wrappers import *
 
class ColorFiltering:
  def __init__(self):
 
    self.camera = Camera(CV_CAP_ANY)
    self.window = Window()
    self.running = True
    self.colour = False
    
  #Francisco: Trying some color filtering
  def filterColorUsingHSV(self, channels=1):
    # compute the hsv version of the image
    hsvImage = cvCreateImage(self.size, self.depth, channels)
    cvCvtColor (self.image, hsvImage, cv.CV_BGR2HSV)
    
    return Image(hsvImage)
    
        # compute which pixels are in the wanted range
    # ranges for the limitation of the histogram
    vmin = 10
    vmax = 256
    smin = 30
    hsv_min = cvScalar (0, smin, vmin, 0)
    hsv_max = cvScalar (180, 256, vmax, 0)
    result = cvCreateImage(self.size, self.image.depth, channels)
    cvInRangeS (hsvImage, hsv_min, hsv_max, result)
    
    return Image(result)
    
  #Francisco: Trying some color filtering
  def filterColorUsingRGB(self, image, channels=1):
    #compute which pixels are in the wanted range
    # ranges for the limitation of the histogram
    
    bmin=50#0;
    bmax=70#110;#190
    gmin=60#0;
    gmax=90#85;#62
    rmin=140#45;#134
    rmax=256#256;#254
    
    
    # Make an image file for colors.
    bimg = cvCreateImage(image.size, IPL_DEPTH_8U, 1)
    gimg = cvCreateImage(image.size, IPL_DEPTH_8U, 1)
    rimg = cvCreateImage(image.size, IPL_DEPTH_8U, 1)
 
    # Split image into individual channels
    cvSplit(image.image,bimg,gimg,rimg,None);
 
    # Create intensity color map
    intensity = cvCreateImage(image.size, IPL_DEPTH_8U, 1)
    cvAdd(bimg,gimg,intensity);
    cvAdd(intensity,rimg, intensity);
    
    #Calculate rgb ratios
    cvDiv(bimg, intensity, bimg, 256);
    cvDiv(gimg, intensity, gimg, 256);
    cvDiv(rimg, intensity, rimg, 256);
 
    # Create rcup mask
    car = cvCreateImage(image.size, IPL_DEPTH_8U, 1)
    bcar = cvCreateImage(image.size, IPL_DEPTH_8U, 1)
    gcar = cvCreateImage(image.size, IPL_DEPTH_8U, 1)
    rcar = cvCreateImage(image.size, IPL_DEPTH_8U, 1)
    cvInRangeS(bimg, cvRealScalar(bmin), cvRealScalar(bmax), bcar);
    cvInRangeS(gimg, cvRealScalar(gmin), cvRealScalar(gmax), gcar);
    cvInRangeS(rimg, cvRealScalar(rmin), cvRealScalar(rmax), rcar);
    
    
    cvAnd(bcar, gcar, car);
    cvAnd(car, rcar, car);
 
    # Filter out noise
    cvErode(car, car, None, 2);
    cvDilate(car, car, None, 2);
    
    return Image(car)
    
  def run(self):
    while self.running:
      current = self.camera.frame()
# self.window.show(self.filterColorUsingRGB(current))
      
      if not self.colour:
        self.colour = createGreenImage(current.size)
 
      output = current.sub(self.colour, channels=3)
 
      self.window.show(output)
      self._handleKeyboardEvents()
 
  def _handleKeyboardEvents(self):
    key = getKeyPressed()
 
    size = cvSize(640,480)
 
    r = createRedImage(size)
    g = createGreenImage(size)
    b = createBlueImage(size)
    y = createYellowImage(size)
    f = createFuchsiaImage(size)
    c = createCyanImage(size)
    
    if key == '\x1b': # escape
      self.window.destroy()
      self.running = False
 
    elif key == '1':
      self.colour = r
 
    elif key == '2':
      self.colour = g
 
    elif key == '3':
      self.colour = b
 
    elif key == '4':
      self.colour = y
 
    elif key == '5':
      self.colour = f
 
    elif key == '6':
      self.colour = c
 
if __name__ == '__main__':
  ColorFiltering().run()