作者MaconChou (得罪了方丈還想走)
看板C_and_CPP
標題[問題] 遞迴與堆疊-Connected Component label
時間Wed Sep 1 13:25:27 2010
先進:
抱歉!小弟初學,如有不足或詞意不明請多多包涵。
遇到的問題:
使用Recursive,出現問題stack overflow -.-
希望得到的正確結果:
和本問題不相關的,想一起問先進的!!以下資訊是!?謝謝。
'VC08182010.exe': Loaded 'D:\Program\Vehicle_LicensePlate\VC08182010\Debug\VC08182010.exe', Symbols loaded.
'VC08182010.exe': Loaded 'C:\Windows\System32\ntdll.dll', Cannot find or open the PDB file
'VC08182010.exe': Loaded 'C:\Windows\System32\kernel32.dll', Cannot find or open the PDB file
'VC08182010.exe': Loaded 'C:\Windows\System32\KernelBase.dll', Cannot find or open the PDB file
'VC08182010.exe': Loaded 'C:\Windows\System32\msvcr100d.dll', Symbols loaded.
'VC08182010.exe': Loaded 'C:\Windows\System32\apphelp.dll', Cannot find or open the PDB file
以下是錯誤資訊!!
First-chance exception at 0x000425ea in VC08182010.exe: 0xC00000FD: Stack overflow.
Unhandled exception at 0x000425ea in VC08182010.exe: 0xC00000FD: Stack overflow.
The program '[1336] VC08182010.exe: Native' has exited with code -1073741571 (0xc00000fd).
程式說明:
此function為要在圖片上找尋是否有255的光點如有的話
,進行connected component label由1~n,圖片大小目前為640*480。
開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux)
win7 / VC++ 2010
有問題的code: (請善用置底文標色功能)
// The function is 8-neighborhood
#include <stdio.h>
#include <stdlib.h>
void FindPixels(unsigned char **, int, int, int *, int ,int);
int ConnectedComponents(unsigned char **Y_Difference, int Width, int Height)
{
int i, j;
int block = 1; // candidate number
char file_name_ConnectedComponents[] = "ConnectedComponents";
WriteXls(Y_Difference, file_name_ConnectedComponents, Width, Height);
for(i = 0; i <= Height - 1; i++)
for(j = 0 ; j <= Width - 1; j++){
if(255 == *(*(Y_Difference + i) + j)){
printf("\nCandidate %d", block);
FindPixels(Y_Difference, i, j, &block, Width, Height);
block++;
}
}
block--;
return block;
}
void FindPixels(unsigned char **Y_Difference, int i, int j, int *block, int Width, int Height)
{
*(*(Y_Difference + i) + j) = *block;
if(i - 1 >=0 && j - 1 >= 0 &&
255 == *(*(Y_Difference + i - 1) + j - 1))
FindPixels(Y_Difference, (i - 1), (j - 1), block, Width, Height);
if(i - 1 >=0 &&
255 == *(*(Y_Difference + i - 1) + j ))
FindPixels(Y_Difference, (i - 1), (j ), block, Width, Height);
if(i - 1 >= 0 && j + 1 <= Width - 1 &&
255 == *(*(Y_Difference + i - 1) + j + 1))
FindPixels(Y_Difference, (i - 1), (j + 1), block, Width, Height);
if(j - 1 >= 0 &&
255 == *(*(Y_Difference + i ) + j - 1))
FindPixels(Y_Difference, (i ), (j - 1), block, Width, Height);
if(j + 1 <= Width - 1 &&
255 == *(*(Y_Difference + i ) + j + 1))
FindPixels(Y_Difference, (i ), (j + 1), block, Width, Height);
if(i + 1 <= Height - 1 && j - 1 >= 0 &&
255 == *(*(Y_Difference + i + 1) + j - 1))
FindPixels(Y_Difference, (i + 1), (j - 1), block, Width, Height);
if(i + 1 <= Height - 1 &&
255 == *(*(Y_Difference + i + 1) + j ))
FindPixels(Y_Difference, (i + 1), (j ), block, Width, Height);
if(i + 1 <= Height - 1 && j + 1 <= Width - 1 &&
255 == *(*(Y_Difference + i + 1) + j + 1))
FindPixels(Y_Difference, (i + 1), (j + 1), block, Width, Height);
return;
}
/*
8-neighborhood Connected Components Label
pixel location is (x, y) for start, and other pixels of find pixels
(x - 1, y - 1) (x - 1, y ) (x - 1, y + 1)
(x , y - 1) (x , y ) (x , y + 1)
(x + 1, y - 1) (x + 1, y ) (x + 1, y + 1)
*/
補充說明:
紅色的字為遞迴。
1.是否是我的遞迴執行過多次!?程式錯誤在4377的遞迴,4377以下的遞迴皆可完成。
但是目前知其中一區塊需遞迴5003次還可以跑完。
2.有試著改爬文中先進所說的變更stack size還是一樣不行,想請問所改的/F
number
這number指的是byte還是!?可能是我試的不夠大嗎!?
3.若在X86上以如此,如移植到DSP晶片上是否應該更不盡理想吧!?
4.是否有撰寫遞迴時須注意的小地方!?
5.或許除了使用遞迴之外是否有比較理想的方式!?
先感謝,回應的先進。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.240.245.74
※ 編輯: MaconChou 來自: 210.240.245.74 (09/01 13:27)
推 holymars:...請不要用遞迴寫 改用陣列模擬或乾脆改成BFS 09/01 14:33
推 yauhh:你的遞迴式看起來一直遞迴,但是沒有哪個遞迴呼叫之後是有個 09/01 20:24
→ yauhh:終點的. 遞迴函式沒有底. 09/01 20:24
→ yauhh:哦,我還沒看完.抱歉,遞迴函式有底. 09/01 20:27
推 VictorTom:找CC只要圖片大一點連的component多一點, 遞迴就可能直 09/01 21:36
→ VictorTom:接call到爆掉; 解法就是1F h大說的XD 09/01 21:37
→ MaconChou:感謝各位先進指教,我用h大的BFS方式來撰寫看看。 09/03 16:53
→ MaconChou:請問還有請問h大您所指的陣列模擬可以細說一下嗎!?謝 09/03 16:54
→ MaconChou:剛剛看了Re,很感謝y大的細說以及l大的說明都可讓小弟有 09/03 17:15
→ MaconChou:深思的地方,真的很感謝!! 09/03 17:15