| 分類:[.NET 全般]
VB.NET2003を使い始めてまだ3ヶ月です。 文脈がわかりづらいかもしれませんが、何卒お願いします。
今回お尋ねしたいのは、4次元配列の宣言時にオーバーフローすることです。
VB.NET2003を用いて、ダーツなどに使われる的の円の検出を、ハフ変換で行っています。 一般的なハフ変換は要素を抽出して・・・という方法がありますが、今回は2点間の距離を求める方法で行います。 理論としては、ある画素p1と、別の画素p2との距離を計測し、距離が等しい点の数を集計して、 もっとも点の数が多かった距離と点をそれぞれ求める円の半径、中心点とする方法を用いています。
今回躓いて悩んでいるのが、2点間の距離を記録しておく領域についてです。 以下、2点間の距離を求めているプログラムを載せます。 ---------------------------------------------------------------------------------
Dim maxX = Edgebmp.Width - 1 'X座標の最大値 Dim maxY = Edgebmp.Height - 1 'Y座標の最大値 Dim D(maxX,maxY,maxX,maxY) As Double '----ここでオーバーフローエラーが発生----'
'2点間の距離を四次元配列に保存 For x As Integer = 0 To maxX For y As Integer = 0 To maxY For i As Integer = 0 To maxX For j As Integer = 0 To maxY D(x,y,i,j)=Math.Sqrt(Math.Pow(x - i, 2) + Math.Pow(y - j, 2)) Next j Next i Next y Next x ---補足------------------------------------------------------------------ EdgebmpとはBitmapで宣言した、Form上のPictureboxの画像を取り込んだものです。 D( A , B , C , D )について、 Aには求める円の仮定中心点x軸座標(プログラムで言えば、変数 x Bには求める円の仮定中心点y軸座標(プログラムで言えば、変数 y Cには求める円の仮定中心点x軸座標(プログラムで言えば、変数 i Dには求める円の仮定中心点y軸座標(プログラムで言えば、変数 j ------------------------------------------------------------------------ 四次元配列Dの宣言時、maxXとmaxYの大きさは画像に依存しますが、 画像の大きさが小さいものならばエラーがないときもあり、処理ができます。できないときもあります。 画像が大きいものはほとんど処理が通りません。
エラーメッセージは 「'System.OutOfMemoryException'のハンドルされていない例外が.exeで発生しました」 となります。
四次元の配列領域がでかすぎるのかと思い、条件わけをするなどして減らしたりしましたがうまくいきません。 エラーを出さずに処理を行う方法、または四次元に代わる方法をご教授いただけないでしょうか?
稚拙な文章で申し訳ないですが、よろしくお願いいたします
|