線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1135
推到 Plurk!
推到 Facebook!

判讀白色線圈數量

尚未結案
roger-c
一般會員


發表:7
回覆:14
積分:4
註冊:2003-11-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-12 23:35:17 IP:218.165.xxx.xxx 未訂閱
我已參考過http://delphi.ktop.com.tw/topic.php?TOPIC_ID=50190裡面的相關內容,但是以八鄰邊法搜尋該線圈的白色位置時,不曉得要用什限制條件來確定搜尋完該階的線圈,並開始計數已得到圖上的線圈量,想麻煩各位大大的指點,謝謝回應囉!
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-12 23:59:07 IP:211.76.xxx.xxx 未訂閱
roger-c 您好: 先假設所有的線圈均為封閉且不相交。 建議搜線方法如下: 1) scan圖形所有的點,當找到白點時暫停, 2) 紀錄目前的位置,並沿著任一方向展開搜尋, 3) 走過的點可重設其值,表示已走過, 4) 當搜尋至走過點時,表示已繞了一圈, 5) 繼續的步驟1),直到scan完整個區域。 RichTop 敬上 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-13 13:49:04 IP:140.135.xxx.xxx 未訂閱
您好:
引言: 要用什限制條件來確定搜尋完該階的線圈,並開始計數已得到圖上的線圈量
試試下面的程式碼
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-13 21:47:24 IP:218.165.xxx.xxx 未訂閱
謝謝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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-13 22:45:20 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-14 00:52:08 IP:218.165.xxx.xxx 未訂閱
謝謝richtop大大熱心提供參考 例如改成   
 
void Connect(Graphics::TBitmap * BMP, int x, int y) { BMP->Canvas->Pixels[x][y] = 200; ..........} 感覺跑出來是計算圈線上的白點數量 我想我還要再多檢查看看
fnk
高階會員


發表:40
回覆:149
積分:102
註冊:2004-01-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-14 06:24:44 IP:140.124.xxx.xxx 未訂閱
不好意思, 插花一下... 其實...taishyang 版大所用的方法, 若我沒看錯, 應該是 "遞迴式的連通量" 技巧, 是機器視覺裡面常用到的技巧, 所以, 若你想進一步了解 taishyang 版大的方法, 可以去找一本 Computer Vision, 裡面的 Connected Component 方法, 希望對你有幫助 !! Good Luck !!
roger-c
一般會員


發表:7
回覆:14
積分:4
註冊:2003-11-20

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-07-14 11:12:51 IP:218.165.xxx.xxx 未訂閱
謝謝fnk大大提供參考方向 我想之前沒弄清楚遞迴式的方法,自己跑的時候碰到些問題,托各位大大之福能順利解決,謝謝囉
系統時間:2024-05-21 0:09:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!