判讀白色線圈數量 |
尚未結案
|
roger-c
一般會員 發表:7 回覆:14 積分:4 註冊:2003-11-20 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
您好:
引言: 要用什限制條件來確定搜尋完該階的線圈,並開始計數已得到圖上的線圈量試試下面的程式碼 void Connect(Graphics::TBitmap * BMP, int x, int y) { BMP->Canvas->Pixels[x][y] = clBlack; // 判斷 (x 1,y) if(BMP->Canvas->Pixels[x 1][y] == clWhite) { Connect(BMP, x 1, y); } // 判斷(x 1, y - 1) if(BMP->Canvas->Pixels[x 1][y - 1] == clWhite) { Connect(BMP, x 1, y - 1); } // 判斷 (x 1,y 1) if(BMP->Canvas->Pixels[x][y - 1] == clWhite) { Connect(BMP, x , y - 1); } // 判斷 (x,y-1) if(BMP->Canvas->Pixels[x-1][y - 1] == clWhite) { Connect(BMP, x-1, y - 1); } // 判斷 (x,y-1) if(BMP->Canvas->Pixels[x-1][y] == clWhite) { Connect(BMP, x-1, y); } // 判斷 (x-1,y) if(BMP->Canvas->Pixels[x - 1][y 1] == clWhite) { Connect(BMP, x - 1, y 1); } // 判斷 (x-1,y-1) if(BMP->Canvas->Pixels[x][y 1] == clWhite) { Connect(BMP, x, y 1); } // 判斷 (x 1,y) if(BMP->Canvas->Pixels[x 1][y 1] == clWhite) { Connect(BMP, x 1, y 1); } // 判斷 (x-1,y 1) if(BMP->Canvas->Pixels[x 1][y] == clWhite) { Connect(BMP, x 1, y); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int ObjCount = 0; Graphics::TBitmap *BMP = new Graphics::TBitmap(); Byte *ptr=NULL; BMP->LoadFromFile("1.bmp"); BMP->PixelFormat=pf24bit; for(int y = 0; y < BMP->Height; y ) { ptr = (Byte *) BMP->ScanLine[y]; for(int x = 0; x < BMP->Width; x ) { if(ptr[x*3] == 255) { Connect(BMP, x, y); ObjCount ; //遞迴完就累積加一 } } } ShowMessage("物件個數為" IntToStr(ObjCount) "個"); delete BMP; } //---------------------------------------------------------------------------順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~> |
roger-c
一般會員 發表:7 回覆:14 積分:4 註冊:2003-11-20 發送簡訊給我 |
謝謝richtop與taishyang兩位大大的指導!
但我想問是關於走過的點可重設其值,表示已走過,
當搜尋至走過點時,表示已繞了一圈,也可以以此表示?
void __fastcall TForm1::Button1Click(TObject *Sender) { int ObjCount = 0; Graphics::TBitmap *BMP = new Graphics::TBitmap(); Byte *ptr=NULL; BMP->LoadFromFile("1.bmp"); BMP->PixelFormat=pf24bit; for(int y = 0; y < BMP->Height; y ) { ptr = (Byte *) BMP->ScanLine[y]; for(int x = 0; x < BMP->Width; x ) { if(ptr[x*3] == 255) { Connect(BMP, x, y); ptr[x*3]=200; ObjCount ; //遞迴完就累積加一 } } } ShowMessage("物件個數為" IntToStr(ObjCount) "個"); delete BMP; } |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
roger-c 您好: taishyang版主大大,提供的程式碼,其實已經把走過的點改成黑色。
看起來似乎已經能算出線圈數了(這麼說是因為我還沒有run過)。
我當時說改成其他值的用意在保留原先的路徑,如果要改設成200的話,Connect(.)程式也要一併修改。
我有寫過一個non-recursive的搜尋邊界的程式,參考底下的連結:
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=49312
您可以參考看看。
|
roger-c
一般會員 發表:7 回覆:14 積分:4 註冊:2003-11-20 發送簡訊給我 |
|
fnk
高階會員 發表:40 回覆:149 積分:102 註冊:2004-01-02 發送簡訊給我 |
|
roger-c
一般會員 發表:7 回覆:14 積分:4 註冊:2003-11-20 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |