|
分類:[.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で発生しました」
となります。
四次元の配列領域がでかすぎるのかと思い、条件わけをするなどして減らしたりしましたがうまくいきません。
エラーを出さずに処理を行う方法、または四次元に代わる方法をご教授いただけないでしょうか?
稚拙な文章で申し訳ないですが、よろしくお願いいたします
|