Vb.net 皮肤检测代码始终显示“;算术溢出“;
为什么这个简单的皮肤检测代码总是返回消息=算术运算导致溢出。Vb.net 皮肤检测代码始终显示“;算术溢出“;,vb.net,image-processing,Vb.net,Image Processing,为什么这个简单的皮肤检测代码总是返回消息=算术运算导致溢出。 xMax = bmp.Width - 1 : yMax = bmp.Height - 1 For y = 0 To yMax For x = 0 To xMax tmpColor = fixColor(bmp.GetPixel(x, y)) If (((tmpColor.R > 95) And (tmpColor.G > 40) And (tmpColor.B > 20) And
xMax = bmp.Width - 1 : yMax = bmp.Height - 1
For y = 0 To yMax
For x = 0 To xMax
tmpColor = fixColor(bmp.GetPixel(x, y))
If (((tmpColor.R > 95) And (tmpColor.G > 40) And (tmpColor.B > 20) And (tmpColor.R - tmpColor.G > 15) And (tmpColor.R > tmpColor.G) And (tmpColor.R > tmpColor.B)) Or _
((tmpColor.R > 220) And (tmpColor.G > 210) And (tmpColor.B > 170) And (tmpColor.R - tmpColor.G <= 15) And (tmpColor.R > tmpColor.B) And (tmpColor.G > tmpColor.B))) Then bmp.SetPixel(x, y, Color.Black)
Next x
Next y
xMax=bmp.Width-1:yMax=bmp.Height-1
对于y=0到yMax
对于x=0到xMax
tmpColor=fixColor(bmp.GetPixel(x,y))
如果((tmpColor.R>95)和(tmpColor.G>40)和(tmpColor.B>20)和(tmpColor.R-tmpColor.G>15)和(tmpColor.R>tmpColor.G)和(tmpColor.R>tmpColor.B))或_
((tmpColor.R>220)和(tmpColor.G>210)和(tmpColor.B>170)和(tmpColor.R-tmpColor.G tmpColor.B)和(tmpColor.G>tmpColor.B)),然后bmp.SetPixel(x,y,Color.Black)
下一个x
下一个y
假设tmpColor
被定义为System.Color
,一个有根据的猜测是,当此错误发生时tmpColor.G
大于tmpColor.R
,这将使结果小于零,并且无法存储到字节中
一个可能的解决办法是这样做
Dim r as integer = tmpColor.R
Dim g as integer = tmpColor.G
Dim b as integer = tmpColor.B
然后在计算中使用这些新值。这将使代码更干净一些(如果在if语句中进行转换,则代码会更干净)
另一种选择是根据该减法重新排序测试,并使用运算符:
(tmpColor.R - tmpColor.G > 15) And (tmpColor.R > tmpColor.G)
'To
(tmpColor.R > tmpColor.G) AndAlso (tmpColor.R - tmpColor.G > 15)
AndAlso
是VB.Net的短路逻辑and运算符,它将导致表达式的计算在第一个False
时停止。由于您只使用了和
s,因此将它们全部替换为和
可能会看到性能的轻微提高
总的来说,这两项的组合可能会使代码更具可读性。看看这个plz