0

この単純な皮膚検出コードが常にMessage=Arithmetic操作を返す理由は、オーバーフローを引き起こしました。

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
4

1 に答える 1

0

tmpColorそれがとして定義されていると仮定すると、知識に基づいSystem.Colorた推測では、このエラーが発生すると、tmpColor.Gが大きくなりtmpColor.R、結果がゼロ未満になり、に格納できなくなりますbyte

考えられる解決策の1つは、これを行うことです。

Dim r as integer = tmpColor.R
Dim g as integer = tmpColor.G
Dim b as integer = tmpColor.B

次に、これらの新しい値を計算に使用します。これにより、コードがいくらかクリーンになります(そして、そのifステートメント内にキャストを配置する場合ははるかにクリーンになります)。

別のオプションは、その減算に依存してテストを並べ替え、 AndAlso演算子を使用することです。

(tmpColor.R - tmpColor.G > 15) And (tmpColor.R > tmpColor.G)
'To
(tmpColor.R > tmpColor.G) AndAlso (tmpColor.R - tmpColor.G > 15)

AndAlsoはVB.Netの短絡論理積演算子であり、式の評価を最初ので停止させFalseます。使用するのはAndsだけなので、それらをすべて置き換えると、AndAlsoパフォーマンスがわずかに向上する可能性があります。

これら2つの項目を組み合わせると、コード全体が読みやすくなる可能性があります。

于 2012-08-02T06:09:15.053 に答える