SimpleCV 汽车检测示例
我正在学习一本书,叫做《用SimpleCV进行实用计算机视觉》,第5章的内容和网上的教程是一样的,链接在这里这里。我发现黄色汽车的平均颜色值和书上、教程里给的不一样,所以我回过头仔细看了一下示例代码,添加了一些注释,还加了一些东西来显示每个阶段的图像(然后再干净地关闭它们)。
from SimpleCV import Image
import time
# Load images.
car_in_lot = Image("parking-car.png")
car_not_in_lot = Image("parking-no-car.png")
# Crop image to region-of-interest.
car = car_in_lot.crop(470,200,200,200)
car.show()
time.sleep(5)
car.show().quit()
# Create greyscale image showing how far from yellow various colors are.
yellow_car = car.colorDistance(Color.YELLOW)
yellow_car.show()
time.sleep(5)
yellow_car.show().quit()
# Subtract greyscale image from cropped image to show just the yellow portions.
only_car = car - yellow_car
only_car.show()
time.sleep(5)
only_car.show().quit()
print only_car.meanColor()
结果返回的是(0.6376000000000001, 2.096775, 5.170425)
,而不是书和教程中给出的(25.604575, 18.880775, 4.4940750000000005)
。
裁剪后的停车位第一张图看起来还不错……但是灰度图像就显得很奇怪了。我得到的图像旋转了90度,根本和示例中的不一样。这里有一个链接,可以在Dropbox上查看。
然后,由于colorDistance()
的结果和应该的值差得太远,平均颜色值也就不对了。
有没有人有什么想法或者建议,为什么colorDistance()
这一步会返回一个奇怪的旋转灰度图像呢?
1 个回答
1
colorDistance 这个方法似乎会返回一个旋转和翻转过的图像。如果你做个简单的变换,就可以避免这种问题。例如:
x,y,w,h = 470,200,200,200
cImg = Image('parking-car.png')
ncImg = Image('parking-no-car.png')
car = cImg.crop(x,y,w,h)
ncar = nImg.crop(x,y,w,h)
ycar = car.colorDistance(Color.YELLOW).rotateRight().flipHorizontal()
nycar = ncar.colorDistance(Color.YELLOW).rotateRight().flipHorizontal()
only_car = car - ycar
nonly_car = ncar - nycar
carmc = only_car.meanColor()
ncarmc = nonly_car.meanColor()
print "yellow car present, mean color:", carmc
print "no yellow car present, mean color", ncarmc
至于 meancolor 不一样,我猜可能是图像稍微调整过,或者 Color.YELLOW 的值发生了变化……
顺便说一下,如果你在比较两个已经调用过 colorDistance 方法的图像(或者从一个裁剪中减去另一个),那么它们都是以相同的方式变换过的,所以你只需要在最终显示图像之前对它进行 rotateRight().flipHorizontal() 的处理(如果需要的话)。