SimpleCV 汽车检测示例

3 投票
1 回答
1815 浏览
提问于 2025-04-18 06:15

我正在学习一本书,叫做《用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() 的处理(如果需要的话)。

撰写回答