opencv-color 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/bin/opencv-color +11 -4
  4. data/color-samples.tb +15 -0
  5. data/color-samples/{light-blue → blue-light}/light-blue1.png +0 -0
  6. data/color-samples/{light-blue → blue-light}/light-blue2.png +0 -0
  7. data/color-samples/{light-blue → blue-light}/light-blue3.png +0 -0
  8. data/color-samples/{light-blue → blue-light}/light-blue4.png +0 -0
  9. data/color-samples/{light-blue → blue-light}/light-blue5.png +0 -0
  10. data/color-samples/{light-blue → blue-light}/light-blue61.png +0 -0
  11. data/color-samples/{light-blue → blue-light}/light-blue7.png +0 -0
  12. data/color-samples/green-dark/darkgreen1.png +0 -0
  13. data/color-samples/green-dark/darkgreen2.png +0 -0
  14. data/color-samples/green-dark/darkgreen3.png +0 -0
  15. data/color-samples/purple/purple1.png +0 -0
  16. data/color-samples/purple/purple10.png +0 -0
  17. data/color-samples/purple/purple2.png +0 -0
  18. data/color-samples/purple/purple3.png +0 -0
  19. data/color-samples/purple/purple4.png +0 -0
  20. data/color-samples/purple/purple5.png +0 -0
  21. data/color-samples/purple/purple6.png +0 -0
  22. data/color-samples/purple/purple7.png +0 -0
  23. data/color-samples/purple/purple8.png +0 -0
  24. data/color-samples/purple/purple9.png +0 -0
  25. data/color-samples/{dark-yellow → yellow-dark}/dark-yellow1.png +0 -0
  26. data/color-samples/{dark-yellow → yellow-dark}/dark-yellow2.png +0 -0
  27. data/color-samples/{dark-yellow → yellow-dark}/dark-yellow3.png +0 -0
  28. data/color-samples/{dark-yellow → yellow-dark}/dark-yellow4.png +0 -0
  29. data/color-samples/{dark-yellow → yellow-dark}/dark-yellow5.png +0 -0
  30. data/color-samples/{dark-yellow → yellow-dark}/dark-yellow6.png +0 -0
  31. data/color-samples/{dark-yellow → yellow-dark}/dark-yellow7.png +0 -0
  32. data/color-samples/{dark-yellow → yellow-dark}/dark-yellow8.png +0 -0
  33. data/color-samples/{dark-yellow → yellow-dark}/dark-yellow9.png +0 -0
  34. data/color-samples/{light-yellow → yellow-light}/light-yellow1.png +0 -0
  35. data/color-samples/{light-yellow → yellow-light}/light-yellow2.png +0 -0
  36. data/color-samples/{light-yellow → yellow-light}/light-yellow3.png +0 -0
  37. data/color-samples/{light-yellow → yellow-light}/light-yellow4.png +0 -0
  38. data/lib/opencv-color.rb +84 -31
  39. data/lib/opencv-color/version.rb +1 -1
  40. data/opencv-color.gemspec +1 -0
  41. data/test/opencv_color_test.rb +95 -0
  42. metadata +54 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3d1ab524bb6fc4578ddff0366bf1211fa8aeb075
4
- data.tar.gz: fd49bdf066ced28c96961ef4a9e2694d3f8ad4ce
3
+ metadata.gz: 3946cad363e3d99564e4160626524cc759f53827
4
+ data.tar.gz: 97cc778daa0740ea60e451a5f6a98e60bb1fd0d8
5
5
  SHA512:
6
- metadata.gz: f99dfd480a7d83a3b9039e4d99fe0d096756daa70dcad9cda613126f137286ec4588c4a9d502fb3efc27b3aa165070516f730282bfd0beb45e51f17702a2c9be
7
- data.tar.gz: 2ea7688d6a4e4a7501e5aa59cb0b9fa717c6eeb6ce33aa0be418ef6f87f96737145b20e785ed54326d4dc6ed2663636938a87dc7db8c33a840e3405516a69bc9
6
+ metadata.gz: fd4c2c695f82da3731016169fe6da72128b72231ecbb9ffa7a449f3771d9a03cc422360fd5f3789ef65d5d6f2b6c48e6ef3dafb3bce2246f8b42493c8ef4c50b
7
+ data.tar.gz: 5a47009144dc0164cf9ae034aee8290e03e83896f213602e2540c094f6c1cfa5112984305944af8e9c03741ac571100fdecbb5f09300111f0139da55a2e60d80
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # OpenCVColor
2
2
 
3
+ [Built with :yellow_heart: and :coffee: in San Francisco](http://getmingle.io)
4
+
3
5
  OpenCV is a great library for writing Computer Vision software. However, OpenCV's HSV format is different than what you would expect! This gem trys to learn HSV color range from sample images for your OpenCV program to detect color.
4
6
 
5
7
  ## Installation
@@ -7,6 +7,7 @@ require 'erb'
7
7
  #add lib for test environment
8
8
  if File.exists?(File.expand_path(File.dirname(__FILE__) + '/../lib/opencv-color.rb'))
9
9
  $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
10
+ require 'rubygems'
10
11
  end
11
12
 
12
13
  begin
@@ -19,12 +20,12 @@ end
19
20
  require 'optparse'
20
21
 
21
22
  options = {
22
- format: 'yaml'
23
+ format: 'table'
23
24
  }
24
25
  op = OptionParser.new do |opts|
25
26
  opts.banner = "Usage: opencv-color [options] <sample images directory path>"
26
27
 
27
- opts.on("-f", "--format [FORMAT]", "Output format 'yaml' or 'objc', default is yaml") do |format|
28
+ opts.on("-f", "--format [FORMAT]", "Output format 'yaml', 'table' or 'objc', default is table") do |format|
28
29
  options[:format] = format
29
30
  end
30
31
 
@@ -44,11 +45,17 @@ unless File.directory?(sample_images_dir)
44
45
  exit(-1)
45
46
  end
46
47
 
47
- data = OpenCVColor.learn(sample_images_dir)
48
+ data = OpenCVColor.learn(sample_images_dir).sort_by{|k,v|v[:low][0]}
48
49
  puts case options[:format]
49
50
  when 'objc'
50
51
  template = File.join(File.dirname(__FILE__), '..', 'lib', 'opencv-color', 'objc.erb')
51
52
  ERB.new(File.read(template)).result(binding)
52
- else
53
+ when 'yaml'
53
54
  YAML.dump(data)
55
+ when 'table'
56
+ require 'terminal-table'
57
+ rows = data.map {|k,v| [k, v[:low], v[:high], v[:mean].map(&:to_i), v[:sd].map(&:to_i)]}
58
+ table = Terminal::Table.new :headings => ["Color", "Low", "High", "Mean", "SD"], :rows => rows
59
+ else
60
+ puts "Unknown format: #{options[:format].inspect}"
54
61
  end
@@ -0,0 +1,15 @@
1
+ +----------------+----------------+-----------------+----------------+-------------+
2
+ | Color | Low | High | Mean | SD |
3
+ +----------------+----------------+-----------------+----------------+-------------+
4
+ | pink_0 | [0, 44, 203] | [5, 75, 255] | [1, 59, 232] | [0, 4, 9] |
5
+ | yellow_dark_0 | [23, 211, 196] | [27, 255, 255] | [24, 233, 229] | [0, 7, 10] |
6
+ | yellow_light_0 | [25, 57, 178] | [31, 117, 255] | [27, 87, 232] | [0, 9, 18] |
7
+ | yellow_green_0 | [28, 87, 146] | [33, 141, 255] | [30, 114, 217] | [0, 8, 23] |
8
+ | green_0 | [28, 30, 182] | [40, 179, 255] | [33, 104, 222] | [1, 24, 13] |
9
+ | yellow_0 | [29, 192, 208] | [33, 218, 255] | [30, 205, 235] | [0, 4, 9] |
10
+ | green_dark_0 | [85, 137, 97] | [92, 159, 117] | [88, 147, 107] | [0, 3, 3] |
11
+ | blue_light_0 | [89, 35, 129] | [97, 87, 255] | [93, 60, 217] | [1, 8, 29] |
12
+ | blue_0 | [95, 98, 143] | [100, 153, 238] | [97, 125, 190] | [0, 9, 15] |
13
+ | purple_0 | [117, 7, 125] | [130, 58, 194] | [123, 32, 159] | [1, 8, 11] |
14
+ | pink_1 | [177, 49, 220] | [179, 68, 253] | [178, 58, 236] | [0, 3, 5] |
15
+ +----------------+----------------+-----------------+----------------+-------------+
@@ -23,55 +23,108 @@ module OpenCVColor
23
23
  end
24
24
  end
25
25
 
26
+ class Cluster
27
+ def initialize(color)
28
+ @h, @s, @v = [], [], []
29
+ @hs = 0
30
+ self << color
31
+ end
32
+
33
+ def <<(color)
34
+ @h << color[0]
35
+ @s << color[1]
36
+ @v << color[2]
37
+ @hs += color[0]
38
+ end
39
+
40
+ def distance(color)
41
+ (center - color[0]).abs
42
+ end
43
+
44
+ def center
45
+ @hs / @h.size
46
+ end
47
+
48
+ def colors
49
+ [@h, @s, @v]
50
+ end
51
+
52
+ def color_range
53
+ memo = {low: [], high: [], mean: [], sd: []}
54
+ colors.map(&:to_scale).each_with_index do |d, index|
55
+ sd = d.sd
56
+ mean = d.mean
57
+
58
+ memo[:low] << ([mean - 3 * sd, 0.0].max).floor
59
+ memo[:high] << ([mean + 3 * sd, max_value(index)].min).ceil
60
+ memo[:mean] << mean
61
+ memo[:sd] << sd
62
+ end
63
+ memo
64
+ end
65
+
66
+ def max_value(i)
67
+ # H => 0
68
+ i == 0 ? 179.0 : 255.0
69
+ end
70
+ end
71
+
26
72
  include OpenCV
27
73
 
28
74
  module_function
29
- def samples(dir)
30
- Dir["#{dir}/*"].map do |color|
31
- [color, Dir["#{color}/*"]]
75
+ def normalize_colors(colors)
76
+ size = colors.map(&:size).min
77
+ colors.map do |cs|
78
+ cs.to_a.shuffle.first(size)
32
79
  end
33
80
  end
34
81
 
35
- def learn(dir)
36
- Hash[samples(dir).map do |color_dir, files|
37
- group = [[], [], []]
38
- files.map(&method(:load_image_colors)).each do |colors|
39
- colors.each do |c|
40
- 3.times do |i|
41
- group[i] << c[i]
42
- end
82
+ def cluster_colors(colors, max_distance=20)
83
+ clusters = []
84
+ colors.each do |cs|
85
+ cs.each do |color|
86
+ cluster = clusters.find do |cluster|
87
+ cluster.distance(color) < max_distance
88
+ end
89
+
90
+ if cluster
91
+ cluster << color
92
+ else
93
+ clusters << Cluster.new(color)
43
94
  end
44
95
  end
45
- range = group.map(&:to_scale).each_with_index.inject({low: [], high: [], mean: [], sd: []}) do |memo, d|
46
- g, index = d
47
- sd = g.sd
48
- mean = g.mean
49
- memo[:low] << ([mean - 3 * sd, min_value].max).floor
50
- memo[:high] << ([mean + 3 * sd, max_value(index)].min).ceil
51
- memo[:mean] << mean
52
- memo[:sd] << sd
53
- memo
54
- end
55
- [color_name(color_dir), range]
56
- end]
96
+ end
97
+ clusters
57
98
  end
58
99
 
59
- def color_name(path)
60
- File.basename(path).downcase.gsub(/[^a-z_]/, '_')
100
+ def samples(dir)
101
+ Dir["#{dir}/*"].map do |color|
102
+ [color, Dir["#{color}/*"]]
103
+ end
61
104
  end
62
105
 
63
- def min_value
64
- 0
106
+ def learn(dir)
107
+ ret = samples(dir).inject({}) do |memo, cd|
108
+ color_dir, files = cd
109
+ colors = files.map(&method(:load_image_colors))
110
+ cluster_colors(normalize_colors(colors)).each_with_index do |cluster, i|
111
+ memo[color_name(color_dir, i)] = cluster.color_range
112
+ end
113
+ memo
114
+ end
115
+ Hash[ret]
65
116
  end
66
117
 
67
- def max_value(i)
68
- # H => 0
69
- i == 0 ? 179 : 255
118
+ def color_name(path, i)
119
+ "#{File.basename(path).downcase.gsub(/[^a-z_]/, '_')}_#{i}"
70
120
  end
71
121
 
72
122
  def load_image_colors(file)
73
123
  img = IplImage.load(file, OpenCV::CV_LOAD_IMAGE_ANYCOLOR | OpenCV::CV_LOAD_IMAGE_ANYDEPTH)
74
- Colors.new(img.smooth(:median, 3).BGR2HSV)
124
+ colors(img.BGR2HSV)
75
125
  end
76
126
 
127
+ def colors(img)
128
+ Colors.new(img)
129
+ end
77
130
  end
@@ -1,3 +1,3 @@
1
1
  module OpenCVColor
2
- VERSION = "1.0.2"
2
+ VERSION = "1.0.3"
3
3
  end
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency('ruby-opencv', "~> 0.0.13")
22
22
  spec.add_dependency('statsample', "~> 1.4.0")
23
+ spec.add_dependency('terminal-table', "~> 1.4.5")
23
24
  spec.add_development_dependency "bundler", "~> 1.7"
24
25
  spec.add_development_dependency "rake", "~> 10.0"
25
26
  end
@@ -0,0 +1,95 @@
1
+ require 'minitest/autorun'
2
+
3
+ require "opencv-color"
4
+
5
+ class TestOpencvColor < MiniTest::Test
6
+
7
+ class Image
8
+ def initialize(data)
9
+ @data = data
10
+ end
11
+
12
+ def width
13
+ height == 0 ? 0 : @data[0].size
14
+ end
15
+
16
+ def height
17
+ @data.size
18
+ end
19
+
20
+ def [](i, j)
21
+ @data[i][j]
22
+ end
23
+ end
24
+
25
+ def test_cluster_colors
26
+ image1 = Image.new([
27
+ [[0,1,1], [1,1,1]],
28
+ [[189,1,1], [190,1,1]]
29
+ ])
30
+
31
+ clusters = OpenCVColor.cluster_colors([OpenCVColor.colors(image1)])
32
+ assert_equal 2, clusters.size
33
+ assert_equal [[0,1], [1,1],[1,1]], clusters[0].colors
34
+ assert_equal [[189,190], [1,1], [1,1]], clusters[1].colors
35
+
36
+ image2 = Image.new([
37
+ [[0,1,1], [1,1,1], [5,1,1], [111, 1, 1]],
38
+ [[3,1,1], [180,1,1], [100,1,1], [115,1,1]]
39
+ ])
40
+
41
+ clusters = OpenCVColor.cluster_colors([OpenCVColor.colors(image1), OpenCVColor.colors(image2)])
42
+
43
+ assert_equal 3, clusters.size
44
+ assert_equal [[0,1,0,1,5,3], [1,1,1,1,1,1], [1,1,1,1,1,1]], clusters[0].colors
45
+ assert_equal [[189,190,180], [1,1,1], [1,1,1]], clusters[1].colors
46
+ assert_equal [[111,100,115], [1,1,1], [1,1,1]], clusters[2].colors
47
+ end
48
+
49
+ def test_cluster_color_range
50
+ image1 = Image.new([
51
+ [[10,10,10], [12,12,12]],
52
+ [[150,150,150], [152,152,152]]
53
+ ])
54
+ clusters = OpenCVColor.cluster_colors([OpenCVColor.colors(image1)])
55
+ assert_equal [6,6,6], clusters[0].color_range[:low]
56
+ assert_equal [16,16,16], clusters[0].color_range[:high]
57
+ assert_equal [11,11,11], clusters[0].color_range[:mean]
58
+
59
+ assert_equal [146,146,146], clusters[1].color_range[:low]
60
+ assert_equal [156,156,156], clusters[1].color_range[:high]
61
+ assert_equal [151,151,151], clusters[1].color_range[:mean]
62
+ end
63
+
64
+ def test_cluster_color_range_min_and_max_values
65
+ image1 = Image.new([
66
+ [[0,0,0], [2,2,2]],
67
+ [[175,250,250], [179,254,254]]
68
+ ])
69
+ clusters = OpenCVColor.cluster_colors([OpenCVColor.colors(image1)])
70
+ assert_equal [0,0,0], clusters[0].color_range[:low]
71
+ assert_equal [6,6,6], clusters[0].color_range[:high]
72
+ assert_equal [1,1,1], clusters[0].color_range[:mean]
73
+
74
+ assert_equal [168,243,243], clusters[1].color_range[:low]
75
+ assert_equal [179,255,255], clusters[1].color_range[:high]
76
+ assert_equal [177, 252, 252], clusters[1].color_range[:mean]
77
+ end
78
+
79
+ def test_normalize_colors_by_min_image_size
80
+ image1 = Image.new([
81
+ [[0,0,0], [2,2,2]],
82
+ [[175,250,250], [179,254,254]]
83
+ ])
84
+ image2 = Image.new([
85
+ [[0,0,0]],
86
+ [[175,250,250]]
87
+ ])
88
+ image3 = Image.new([
89
+ [[0,0,0],[0,0,0],[0,0,0]],
90
+ [[175,250,250],[0,0,0],[0,0,0]]
91
+ ])
92
+ colors = OpenCVColor.normalize_colors([OpenCVColor.colors(image1), OpenCVColor.colors(image2), OpenCVColor.colors(image3)])
93
+ assert_equal [2,2,2], colors.map(&:size)
94
+ end
95
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opencv-color
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xiao Li
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-30 00:00:00.000000000 Z
11
+ date: 2015-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-opencv
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.4.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: terminal-table
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.4.5
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.4.5
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -83,6 +97,14 @@ files:
83
97
  - Rakefile
84
98
  - TODO
85
99
  - bin/opencv-color
100
+ - color-samples.tb
101
+ - color-samples/blue-light/light-blue1.png
102
+ - color-samples/blue-light/light-blue2.png
103
+ - color-samples/blue-light/light-blue3.png
104
+ - color-samples/blue-light/light-blue4.png
105
+ - color-samples/blue-light/light-blue5.png
106
+ - color-samples/blue-light/light-blue61.png
107
+ - color-samples/blue-light/light-blue7.png
86
108
  - color-samples/blue/blue01.png
87
109
  - color-samples/blue/blue02.png
88
110
  - color-samples/blue/blue2.png
@@ -92,31 +114,14 @@ files:
92
114
  - color-samples/blue/blue6.png
93
115
  - color-samples/blue/blue7.png
94
116
  - color-samples/blue/blue8.png
95
- - color-samples/dark-yellow/dark-yellow1.png
96
- - color-samples/dark-yellow/dark-yellow2.png
97
- - color-samples/dark-yellow/dark-yellow3.png
98
- - color-samples/dark-yellow/dark-yellow4.png
99
- - color-samples/dark-yellow/dark-yellow5.png
100
- - color-samples/dark-yellow/dark-yellow6.png
101
- - color-samples/dark-yellow/dark-yellow7.png
102
- - color-samples/dark-yellow/dark-yellow8.png
103
- - color-samples/dark-yellow/dark-yellow9.png
117
+ - color-samples/green-dark/darkgreen1.png
118
+ - color-samples/green-dark/darkgreen2.png
119
+ - color-samples/green-dark/darkgreen3.png
104
120
  - color-samples/green/green1.png
105
121
  - color-samples/green/green2.png
106
122
  - color-samples/green/green3.png
107
123
  - color-samples/green/green4.png
108
124
  - color-samples/green/green5.png
109
- - color-samples/light-blue/light-blue1.png
110
- - color-samples/light-blue/light-blue2.png
111
- - color-samples/light-blue/light-blue3.png
112
- - color-samples/light-blue/light-blue4.png
113
- - color-samples/light-blue/light-blue5.png
114
- - color-samples/light-blue/light-blue61.png
115
- - color-samples/light-blue/light-blue7.png
116
- - color-samples/light-yellow/light-yellow1.png
117
- - color-samples/light-yellow/light-yellow2.png
118
- - color-samples/light-yellow/light-yellow3.png
119
- - color-samples/light-yellow/light-yellow4.png
120
125
  - color-samples/pink/pink1.png
121
126
  - color-samples/pink/pink2.png
122
127
  - color-samples/pink/pink3.png
@@ -125,9 +130,32 @@ files:
125
130
  - color-samples/pink/pink71.png
126
131
  - color-samples/pink/pink8.png
127
132
  - color-samples/pink/pink9.png
133
+ - color-samples/purple/purple1.png
134
+ - color-samples/purple/purple10.png
135
+ - color-samples/purple/purple2.png
136
+ - color-samples/purple/purple3.png
137
+ - color-samples/purple/purple4.png
138
+ - color-samples/purple/purple5.png
139
+ - color-samples/purple/purple6.png
140
+ - color-samples/purple/purple7.png
141
+ - color-samples/purple/purple8.png
142
+ - color-samples/purple/purple9.png
143
+ - color-samples/yellow-dark/dark-yellow1.png
144
+ - color-samples/yellow-dark/dark-yellow2.png
145
+ - color-samples/yellow-dark/dark-yellow3.png
146
+ - color-samples/yellow-dark/dark-yellow4.png
147
+ - color-samples/yellow-dark/dark-yellow5.png
148
+ - color-samples/yellow-dark/dark-yellow6.png
149
+ - color-samples/yellow-dark/dark-yellow7.png
150
+ - color-samples/yellow-dark/dark-yellow8.png
151
+ - color-samples/yellow-dark/dark-yellow9.png
128
152
  - color-samples/yellow-green/yellow-green1.png
129
153
  - color-samples/yellow-green/yellow-green2.png
130
154
  - color-samples/yellow-green/yellow-green3.png
155
+ - color-samples/yellow-light/light-yellow1.png
156
+ - color-samples/yellow-light/light-yellow2.png
157
+ - color-samples/yellow-light/light-yellow3.png
158
+ - color-samples/yellow-light/light-yellow4.png
131
159
  - color-samples/yellow/yellow01.png
132
160
  - color-samples/yellow/yellow10.png
133
161
  - color-samples/yellow/yellow2.png
@@ -136,6 +164,7 @@ files:
136
164
  - lib/opencv-color/objc.erb
137
165
  - lib/opencv-color/version.rb
138
166
  - opencv-color.gemspec
167
+ - test/opencv_color_test.rb
139
168
  homepage: https://github.com/xli/opencv-color
140
169
  licenses:
141
170
  - MIT
@@ -156,8 +185,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
185
  version: '0'
157
186
  requirements: []
158
187
  rubyforge_project:
159
- rubygems_version: 2.2.0
188
+ rubygems_version: 2.2.2
160
189
  signing_key:
161
190
  specification_version: 4
162
191
  summary: Learn OpenCV HSV color range from sample images.
163
- test_files: []
192
+ test_files:
193
+ - test/opencv_color_test.rb