![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
ただいまdelphiで直線検出のハフ変換のプログラムを書いているのですが、コンパイルし、実行しようとするとスタックオーバーフローになってしまいます。
おそらく2次元配列のcounterの部分だと思うのですが、どなたか回避の仕方お分かりになるでしょうか?
ご存じの方いらっしゃいましたら教えて下さい。
下記にハフ変換の部分のコードを載せます。
他にも何か気付いた点ありましたらご指摘お願いいたします。
○直線検出のハフ変換○
var
i, j, k, n: Integer;
rx, ry: Integer;
clr: tcolor;
R: longint;
counter_max: Integer;
THETA_RESOLUTION, RHO_RESOLUTION, LNUMBER_MAX: Integer;
pai: Double;
theta, rho: Integer;
theta_max, rho_max, count: Integer;
theta_cut, rho_cut: Integer;
counter:array[0..1023,0..1999] of Integer; //直線検出のためのカウンタ
sn:array[0..1023] of Double; //sin
cs:array[0..1023] of Double; //cos
begin
THETA_RESOLUTION:=1024; //thetaの範囲は0から1023まで
RHO_RESOLUTION:=2000; //rhoの範囲は-1000から999まで
LNUMBER_MAX:=15; //検索する電線の数は15まで
pai:=PI / THETA_RESOLUTION; //π÷THETA_RESOLUTION
for i:=0 to 1023 do //sinとcosのテーブルを用意
begin
sn[i]:=Sin(pai*i);
cs[i]:=Cos(pai*i);
end;
//ハフ変換の実行//
for rx:=0 to 639 do
begin
for ry:=0 to 479 do
begin
clr:=image1.Canvas.Pixels[rx,ry];
R:=colortorgb(clr);
if(getrvalue(R)=0)and(getgvalue(R)=0)and(getbvalue(R)=0) then //黒である
for theta:=0 to 1023 do
begin
rho:=Trunc(rx*cs[theta]+ry*sn[theta]+0.5);
counter[theta,rho+1000]:=counter[theta,rho+1000]+1;
end;
end;
end;
//ハフ逆変換の実行//
for n:=0 to 14 do
begin
//counterが最大になるtheta_maxとrho_maxを求める//
counter_max:=0;
for theta:=0 to 1023 do
begin
for rho:=-RHO_RESOLUTION div 2 to RHO_RESOLUTION div 2-1 do
begin
if(counter[theta,rho+RHO_RESOLUTION div 2] > counter_max) then
begin
counter_max:=counter[theta,rho+RHO_RESOLUTION div 2];
theta_max:=theta;
rho_max:=rho;
count:=counter_max;
end;
end;
end;
//counter[theta_max,rho_max]の近傍を0にする//
for i:=-20 to 20 do
begin
for j:=-10 to 10 do
begin
theta_cut:=theta_max+i;
rho_cut:=rho_max+j;
if(theta_cut < 0) then
begin
theta_cut:=theta_cut+THETA_RESOLUTION;
rho_cut:=-rho_cut;
end
else if(theta_cut > THETA_RESOLUTION-1) then
begin
theta_cut:=theta_cut-THETA_RESOLUTION;
rho_cut:=-rho_cut;
end;
counter[theta_cut,rho_cut+RHO_RESOLUTION div 2]:=0; //削除する
end;
end;
//ハフ逆変換した結果の表示//
if(theta_max<>0) then //垂線の線を描く
begin
for rx:=0 to 639 do
begin
ry:=Trunc((rho_max-rx*cs[theta_max])/sn[theta_max]+0.5);
if(ry>=480)or(ry<0) then continue;
image1.Canvas.Pixels[rx,ry]:=RGB(255,0,0);
end;
end;
if(theta_max<>THETA_RESOLUTION div 2) then //水平の線を描く
begin
for ry:=0 to 479 do
begin
rx:=Trunc((rho_max-ry*sn[theta_max])/cs[theta_max]+0.5);
if(rx>=640)or(rx<0) then continue;
image1.Canvas.Pixels[rx,ry]:=RGB(255,0,0);
end;
end;
//直線を形成するピクセルが60個未満になったら表示しない//
if count<60 then break;
end;
end;
No.1ベストアンサー
- 回答日時:
もう見てないかもしれませんが、
counter:array of array of Integer;
と、動的配列にして、使う前に
SetLength(counter ,THETA_RESOLUTION,RHO_RESOLUTION );
で確保してください。少なくとも私の環境はこれで動作します。まだスタックが足りない場合には大きい配列は全部動的配列に変えてください。
Windowsは静的に巨大な配列は確保できません。ヒープ領域に確保します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) 物理の斜方投射で目盛りに数値を入れたい 2 2023/05/27 06:32
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- その他(プログラミング・Web制作) listへのappendが出来ない件 1 2022/12/06 21:44
- その他(プログラミング・Web制作) 物理の斜方投射の目盛り線とx軸、y軸の追加について 3 2023/05/26 21:11
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
- その他(プログラミング・Web制作) Pythonにおける物理のシミュレーションでの単位変換について 2 2023/06/02 17:11
- その他(プログラミング・Web制作) Pythonでのかんたんな物理シミュレーションについての書籍 5 2023/06/02 07:37
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- その他(プログラミング・Web制作) 物理の斜方投射のシミュレーションにおける位置や速度の単位について 4 2023/05/31 09:50
- その他(プログラミング・Web制作) Pythonによる物理の斜方投射の位置座標表示について 2 2023/06/05 12:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
タイムアウトする仕組みを作りたい
-
日付の重複
-
直線検出のハフ変換プログラム(...
-
subsequentとnextの違いってな...
-
エクセルVBAでテキストボッ...
-
VB.NETでのイベントの途中終了
-
VBA public変数はどのようなこ...
-
String型の値にスラッシュをつ...
-
ExcelのVBAで文章にある複数の...
-
vbsでスクロール位置を指定して...
-
texで図と表を並べたい
-
演奏記号の・・・・
-
一行飛ばしで合計
-
TextBoxの内容を右寄せ
-
Googleシート「A1」でなくて「A...
-
ユーザーフォームへのデータ入...
-
GetNextWindowがDLLファイルUse...
-
テキストボックスにカーソルを...
-
複数条件のオートフィルタ(VBA)
-
Excel VBAでsub,dimは何の略?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコードセットにnullの場合
-
タイムアウトする仕組みを作りたい
-
subsequentとnextの違いってな...
-
verilogのcase文
-
日付の重複
-
vbsのmsgboxランダム表示について
-
リスト間のアイテム移動について
-
TreeViewのTag情報取得
-
pascalでの二分探索(バイナリ...
-
delphi
-
Pascalのプログラムです
-
C言語のプログラムで...
-
【FPGA】VHDLのprocessとevent
-
エクセルVBAついて ①if•••••the...
-
FORTRAN77でプログラミング
-
クラスモジュールの処理
-
EXCEL VBA 文字 アドレス 検...
-
パスカル言語
-
Verilog-HDLによる設計において
-
なんで? cEn-P^-1AP=P^-1(cEn-AP)
おすすめ情報