全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3192
推到 Plurk!
推到 Facebook!

C++轉換到BCB的程式

尚未結案
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-31 02:22:48 IP:220.139.xxx.xxx 未訂閱
想請問各位高手~~為什麼我以下用C++所寫的程式改到BCB的模式來撰寫所得到的結果卻不相同?> <  
 
C++程式如下:            int flag=0;
        while(flag==0)    //當buff[i]buff[j]有改變時,flag=0,執行up-down pass和botton-up pass
        {
                flag=1;       //設flag初始值為1
    ////////up-down pass////////////////////////////////////////
for(i=1;i0)
                {
                        for(x=i-1;x<=i+1;x++)
                        {
                                for(y=j-1;y<=j+1;y++)
                                {
                                        if(buff[x][y]0)
                                                                {
                                                                        newlabel=buff[x][y];  //if value change,flag=0,執行迴圈
                                                                    flag=0;            //if does'n change,flag=1,跳出迴圈
                                                                }
                                        }
                                }
                        }
                buff[i][j]=newlabel;                    }
        }
}        ////////botton-up pass/////////////////////////////////////////////
for(i=nr-2;i>0;i--)
{
        for(j=nc-2;j>0;j--)
        {
                newlabel=buff[i][j];
                if(buff[i][j]>0)
                {
                        for(x=i-1;x<=i+1;x++)
                        {
                                for(y=j-1;y<=j+1;y++)
                                {
                                        if(buff[x][y]0)
                                                                {
                                                                        newlabel=buff[x][y];
                                                                    flag=0;
                                                                }
                                        }
                                }
                        }
                        buff[i][j]=newlabel;
                }
        }
}
}    //累加每個label的大小 area_histogram 所編號物體 面積統計圖
int area_max=0;
int lab1=0; 
float *area_histogram;
area_histogram=(float *) malloc (nr*nc*sizeof(float *));
for(n=1;n<=max;n++)
   area_histogram[n]=0.0;  //設初始值為0         for(i=0;i0)
                {
                n=(int)buff[i][j];
                area_histogram[n]=area_histogram[n]+1;
                        
                }
                                
        }
        }
        //取每個編號中 最大連通區域  去除雜訊小區塊
        
for(n=1;n<=max;n++)
{
        if(area_histogram[n]>area_max)
        area_max=area_histogram[n];
}
//取同一編號中 最大連通面積
for(n=1;n<=max;n++)
   if(area_histogram[n]>=area_max/25)
   {lab1=n;                for(i=0;i    
BCB程式如下:
int flag;
while(flag==0)
  {
   flag=1;
    for(int i=0;iHeight-1;i++)
     {
      ptr2 = (Byte *)bmp2->ScanLine[i];
      for(int j=0;jWidth-1;j++)
       {
        newlabel=ptr2[3*j];
         if(ptr2[3*j]>0)
          {
           for(y=i-1;y<=i+1;y++)
           {
            ptr2 = (Byte *)bmp2->ScanLine[y];
             for(x=j-1;x<=j+1;x++)
             {
              if(ptr2[3*x]0)
                 {                     newlabel=ptr2[3*x];
                 newlabel=ptr2[3*x+1];
                 newlabel=ptr2[3*x+2];
                 flag=0;
                 }
               }
             }
           }
          ptr2[3*j]=newlabel;
          ptr2[3*j+1]=newlabel;
          ptr2[3*j+2]=newlabel;
          }
       }
     }
for(int i=bmp1->Height-2;i>0;i--)
{
  ptr2 = (Byte *)bmp2->ScanLine[i];
  for(int j=bmp1->Width-2;j>0;j--)
 {
    newlabel=ptr2[3*j];
    ptr2[3*j]=ptr2[3*j+1]=ptr2[3*j+2];
    if(ptr2[3*j]>0)
  {
     for(y=i-1;y<=i+1;y++)
    {
     ptr2 = (Byte *)bmp2->ScanLine[y];
     for(x=j-1;x<=j+1;x++)
     {
      if(ptr2[3*x]0)
       {            newlabel=ptr2[3*x];
        newlabel=ptr2[3*x+1];
        newlabel=ptr2[3*x+2];
        flag=0;
       }
      }
     }
    }
   ptr2[3*j]=newlabel;
   ptr2[3*j+1]=newlabel;
   ptr2[3*j+2]=newlabel;
  }
 }
}
}
int area_max=0;
int lab1=0,i,j;
float *area_histogram;
area_histogram=(float*)malloc((bmp1->Height)*(bmp1->Width)*sizeof(float*));
for(n=1;n<=max;n++)
 area_histogram[n]=0.0;
 for(i=0;iHeight;i++)
 {
  ptr2= (Byte *)bmp2->ScanLine[i];
  for(j=0;jWidth;j++)
  {       if(ptr2[3*j]>0)
   {
    n=(int)ptr2[3*j];
    n=(int)ptr2[3*j+1];
    n=(int)ptr2[3*j+2];
    area_histogram[n]=area_histogram[n]+1;
    }
   }
  }
  for(n=1;n<=max;n++)
  {
   if(area_histogram[n]>area_max)
   area_max=area_histogram[n];
   }
   for(n=1;n<=max;n++)
   if(area_histogram[n]>=area_max/Control_NA)
   {
    lab1=n;
    for(i=0;iHeight;i++)
    {
     ptr1= (Byte *)bmp1->ScanLine[i];
     ptr2= (Byte *)bmp2->ScanLine[i];
     for(j=0;jWidth;j++)
    {
     if(ptr2[3*j]==lab1)
     {
          ptr1[3*j]=(loop+1)*50;
          ptr1[3*j+1]=(loop+1)*50;
          ptr1[3*j+2]=(loop+1)*50;
     }        }
   }
  } 
原始圖 BCB跑出來的圖 C++跑出來的圖 以上是我跑出來的結果 BCB跑出來的黑點太少~~這樣等於是沒有去雜點的動作> < 希望各位高手的幫忙與指教 發表人 -
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-31 09:26:52 IP:210.68.xxx.xxx 未訂閱
您好:     您是否有指定pixelformat = pf24bit  順心
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-31 15:28:50 IP:220.139.xxx.xxx 未訂閱
感謝taishyang 我有指定pixelformat = pf24bit > < 是不是histogram納編出了問題? 還是CCL那邊就錯了~~ 希望各位高手能夠幫我解答
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-01 20:00:46 IP:221.169.xxx.xxx 未訂閱
BCB的這段code有問題
    for(int i=0;iHeight-1;i  )
     {
      ptr2 = (Byte *)bmp2->ScanLine[i];
      for(int j=0;jWidth-1;j  )
       {
        newlabel=ptr2[3*j];
         if(ptr2[3*j]>0)
          {
           for(y=i-1;y<=i 1;y  )
           {
            ptr2 = (Byte *)bmp2->ScanLine[y];
...
第二段紅色的code會修改ptr2的值 會使得藍色的code引用到錯誤的ptr2的值,正確的情況下,藍色的code應該引用第一段紅色code得到的ptr2的值 另外也沒看到max和loop的值是多少 還有你的程式看起來像是每一個點去搜尋周圍3x3範圍,用最大值取代中心點的值,但是有個問題,以下面的4x3圖為例 abcd efgh ijkl (每一個英文字母代表不同影像值) 第一次比較abc efg ijk等九個元素,並將最大值寫到f這個位置 假設a最大好了,第一個迴圈跑完後,得到 abcd eagh ijkl 第二次迴圈進行的時候,會比較 bcd agh jkl 等九個元素.. 等等,不是應該比較 bcd fgh jkl 嗎? 但是f在第一個迴圈的時候就被取代掉了,所以現在f那個位置的值已經變成a了! 如果你是要用原始的 bcd fgh jkl 來比較,則你現在的code要修改 取得的最大值應該寫到另外一個陣列去,而不應該寫回buff陣列 還有你flag的用途似乎沒有意義 就程式碼看起來,無論如何,跑完一個up-down pass,flag一定會是0 (除非你的影像是[1,1]位置有值,其他位置都沒有值... ) 其他的就沒仔細看了~
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-02 15:37:06 IP:163.28.xxx.xxx 未訂閱
感謝justdo大大的回答^^ 我不知道po部分程式是不是造成我的問題不清楚 我的程式CCL的概念應該是...找出整張圖灰階為1(<--這是假設值)然後做編號的動作,而max就是最後找到pixel為1的灰階值的號碼(假設是15027)    loop只是在說明找尋整張影像灰階值為1或2或3而已    -------------- (以上程式沒有po出來,如果需要我po出來會比較清楚我我要問的問題,再麻煩各位高手與我告知^^) 接著再用我po出來的程式用3*3的遮罩去讓有連通的每一個編號都變成遮罩裡面編號最小的值,直到沒有連通為止再從另一個編號值去做,這樣就能找到ㄧ張影像中灰階值同為1的區塊面積 所以是找最小值取代全部遮罩裡面的編號值,不是用最大值取代中間的值 以justdo大大的說明為例 abcd efgh ijkl 如果a>0且是3*3遮罩裡面值最小的就讓b,c,e,f,g,i,j,k的編號都變為a aaad aaah aaal 接著做完botton-up pass 我再用histogram的觀念來求同樣灰階值的最大面積,其餘補0    不好意思~~可能我的問題沒有說明清楚 < > 麻煩各位大大再幫我看一次我的程式哪裡出了問題 小女子感激不盡< > 發表人 - akino0910 於 2005/11/02 17:39:54
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-11-02 19:16:45 IP:163.28.xxx.xxx 未訂閱
BCB的這段code有問題        for(int i=0;iHeight-1;i ) { ptr2 = (Byte *)bmp2->ScanLine[i]; for(int j=0;jWidth-1;j ) { newlabel=ptr2[3*j]; if(ptr2[3*j]>0) { for(y=i-1;y<=i 1;y ) { ptr2 = (Byte *)bmp2->ScanLine[y]; ... 第二段紅色的code會修改ptr2的值 會使得藍色的code引用到錯誤的ptr2的值,正確的情況下,藍色的code應該引用第一段紅色code得到的ptr2的值 後面那ㄧ個ptr2是宣告3*3遮罩,裡面的值是x,這樣對前面藍色的部份會有影響嗎?這樣的模式寫在C 會什麼就可以實現? 我剛剛有把justdo大大的建議看了一下 flag裡面的程式好像沒有去作執行的動作>< 可是我把flag那個迴圈移除,讓程式裡面沒有flag這個變數的存在 卻跑出超出範圍的錯誤訊息 希望各位大大在幫我看一下 謝謝^^
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-02 22:43:15 IP:221.169.xxx.xxx 未訂閱
引言: 以justdo大大的說明為例 abcd efgh ijkl 如果a>0且是3*3遮罩裡面值最小的就讓b,c,e,f,g,i,j,k的編號都變為a aaad aaah aaal
同理,現在要比較右邊的3x3區塊時,原本應該比較bcd fgh jkl 卻變成比較 aad aah aal了 所以,應該要寫到另外一個陣列去才對,不然會影響到下一個比較的結果 至於為何BCB才會遇到指標出問題這種情況... 因為你c 那邊的code沒用到指標呀,而是直接用二維陣列去存取的... 另外,要問問題的時候,也交代一下你程式在做什麼事,別人比較能進入狀況
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-03 17:12:22 IP:163.28.xxx.xxx 未訂閱
感謝justdo大大的回覆^^ 很不好意思我的問題依職沒說清楚...造成您的誤會 連通那邊的程式(就是CCL的意義)應該時如下面的例子 EX: 0 1 1 1 1 0 0 0 0 0           0 0 1 1 1 0 0 0 0 0          0 0 0 1 1 0 0 0 0 0                                0 0 0 0 0 1 1 1 0 0  1 1 1 0 0 1 1 0 0 0      1 0 1 0 0 1 0 0 0 0  0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 0 1 1  0 0 1 1 1 0 0 1 1 1  0 0 0 1 1 1 0 0 1 1      原本的灰階值為1的部份    0  1  2  3  4  0  0  0  0  0           0  0  5  6  7  0  0  0  0  0          0  0  0  8  9  0  0  0  0  0                                0  0  0  0  0  10 11 12 0  0  13 14 15 0  0  16 17 0  0  0      18 0  19 0  0  20 0  0  0  0  0  0  0  21 22 0  0  0  0  23 0  0  24 25 26 0  0  0  27 28  0  0  29 30 31 0  0  32 33 34  0  0  0  35 36 37 0  0  38 39    這是將灰階值為1的做編號    0  1  1  1  1  0  0  0  0  0           0  0  1  1  1  0  0  0  0  0          0  0  0  1  1  0  0  0  0  0                                0  0  0  0  0  10 10 10 0  0  13 13 13 0  0  10 10 0  0  0      13 0  13 0  0  10 0  0  0  0  0  0  0  21 21 0  0  0  0  23 0  0  21 21 21 0  0  0  23 23  0  0  21 21 21 0  0  23 23 23  0  0  0  21 21 21 0  0  23 23    這是經過CCL連通部分後的結果 區分出區塊有1,10,13,21,23等區塊 接著再去算面積大小,比較出何者比較大 所以與justdo大大說的另外寫一個陣列來存變化後的值的概念好像不太相同 當然這是我問題沒說清除誤導了 > 希望經過我的說明問題後,> <
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-11-04 08:03:52 IP:221.169.xxx.xxx 未訂閱
我看還是把整個程式上傳上來好了..    另外  我的程式沒有跑連通部分> <  <=這句話是什麼意思?    up-down pass 跟down-up的功能是? CCL是什麼? connected component l??? 如果只是要做相連通,這邊已經有人做出來了,不過是用遞迴的方式http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57709 另外,你BCB的程式跑出來的結果跟c 的一樣了嗎? 如果一樣,這個討論就可以結束,另外開一個新主題,來討論CCL
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-11-04 13:31:13 IP:163.28.xxx.xxx 未訂閱
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Graphics::TBitmap *bmp1 = new Graphics::TBitmap();
Graphics::TBitmap *bmp2 = new Graphics::TBitmap();
Graphics::TBitmap *bmp3 = new Graphics::TBitmap();
Graphics::TBitmap *bmp4 = new Graphics::TBitmap();
Graphics::TBitmap *bmp5 = new Graphics::TBitmap();
Graphics::TBitmap *bmp6 = new Graphics::TBitmap();
Graphics::TBitmap *bmp7 = new Graphics::TBitmap();
Byte *ptr1=NULL,*ptr2=NULL,*ptr3=NULL,*ptr4=NULL,*ptr5=NULL,*ptr6=NULL,*ptr7=NULL;
int x,y,n=0,loop,max;
int Control_NA=2;
bmp1=Image2->Picture->Bitmap;
bmp3=Image1->Picture->Bitmap;
bmp1->Width = bmp3->Width;
bmp1->Height = bmp3->Height;
bmp2->Width = bmp3->Width;
bmp2->Height = bmp3->Height;
bmp1->PixelFormat=pf24bit;
bmp2->PixelFormat=pf24bit;
bmp3->PixelFormat=pf24bit;
bmp4->Assign(bmp1);
bmp5->Assign(bmp1);
bmp6->Assign(bmp1);
bmp7->Assign(bmp1);
  for(int i=0;iHeight;i++)
  {
    ptr1 = (Byte *)bmp1->ScanLine[i];
    for(int j=0;jWidth*3;j++)
    {
      ptr1[j]=0;
    }
  }    float label=0;
float newlabel;
for(loop=0;loop<3;loop++)
{
  for(int i=0;iHeight;i++)
   {
     ptr2 = (Byte *)bmp2->ScanLine[i];
     ptr3 = (Byte *)bmp3->ScanLine[i];
    for(int j=0;jWidth;j++)
     {
       if(ptr3[3*j]==(loop+1))
       {
         label=label+1;
         ptr2[3*j]=label;
         ptr2[3*j+1]=label;
         ptr2[3*j+2]=label;
       }
       else
       {
         ptr2[3*j]=0;
         ptr2[3*j+1]=0;
         ptr2[3*j+2]=0;
       }
     }
   }
max=(int)label;
ShowMessage(AnsiString("We get max =")+ max );
int flag;
while(flag==0)
{
 flag=1;        for(int i=1;iHeight-1;i++)
     {
      ptr2 = (Byte *)bmp2->ScanLine[i];
      for(int j=1;jWidth-1;j++)
       {
        newlabel=ptr2[3*j];
         if(ptr2[3*j]>0)
          {
           for(y=i-1;y<=i+1;y++)
           {
            ptr2 = (Byte *)bmp2->ScanLine[y];
             for(x=j-1;x<=j+1;x++)
             {
              if(ptr2[3*x]0)
                 {                     newlabel=ptr2[3*x];
                 newlabel=ptr2[3*x+1];
                 newlabel=ptr2[3*x+2];
                 flag=0;
                 }
               }
             }
           }
          ptr2[3*j]=newlabel;
          ptr2[3*j+1]=newlabel;
          ptr2[3*j+2]=newlabel;
          }
       }
     }
for(int i=bmp1->Height-2;i>0;i--)
{
  ptr2 = (Byte *)bmp2->ScanLine[i];
  for(int j=bmp1->Width-2;j>0;j--)
 {
    newlabel=ptr2[3*j];        if(ptr2[3*j]>0)
  {
     for(y=i-1;y<=i+1;y++)
    {
     ptr2 = (Byte *)bmp2->ScanLine[y];
     for(x=j-1;x<=j+1;x++)
     {
      if(ptr2[3*x]0)
       {            newlabel=ptr2[3*x];
        newlabel=ptr2[3*x+1];
        newlabel=ptr2[3*x+2];
        flag=0;
       }
      }
     }
    }
   ptr2[3*j]=newlabel;
   ptr2[3*j+1]=newlabel;
   ptr2[3*j+2]=newlabel;
  }
 }
}
}
 
int area_max=0;
int lab1=0,i,j;
float *area_histogram;
area_histogram=(float*)malloc((bmp1->Height)*(bmp1->Width)*sizeof(float*));
for(n=1;n<=max;n++)
 area_histogram[n]=0.0;
 for(i=0;iHeight;i++)
 {
  ptr2= (Byte *)bmp2->ScanLine[i];
  for(j=0;jWidth;j++)
  {       if(ptr2[3*j]>0)
   {
    n=(int)ptr2[3*j];
    n=(int)ptr2[3*j+1];
    n=(int)ptr2[3*j+2];
    area_histogram[n]=area_histogram[n]+1;
    }
   }
  }
    ShowMessage(AnsiString("We get area_histogram ")+n+AnsiString("=")+ area_histogram[n] );
  for(n=1;n<=max;n++)
  {
   if(area_histogram[n]>area_max)
   area_max=area_histogram[n];
   }
   for(n=1;n<=max;n++)
   {
   if(area_histogram[n]>=area_max/Control_NA)
   {
    lab1=n;
    for(i=0;iHeight;i++)
    {
     ptr1= (Byte *)bmp1->ScanLine[i];
     ptr2= (Byte *)bmp2->ScanLine[i];
     for(j=0;jWidth;j++)
    {
     if(ptr2[3*j]==lab1)
     {
          ptr1[3*j]=(loop+1)*50;
          ptr1[3*j+1]=(loop+1)*50;
          ptr1[3*j+2]=(loop+1)*50;
     }
    }
   }
  }
  }
    Image2->AutoSize=true;
    Image2->Picture->Assign(bmp1);
 }
// delete bmp1;
}
 
我的程式沒有跑連通部分是說他會跳過我最一開始po的部份程式的地方,在上面完整程式我標紅色 up-down pass跟botton-up pass的意思是: CCL是connented component labeling 報告justdo大大 我用BCB跟C++跑出來的圖結果不ㄧ樣,而問題點就在執行時它跳過了我標紅色那ㄧ段程式 我有想過用你給我的那ㄧ個網值上面的程式去執行它連通的部分,可是執行不出來....可能是我不知道怎加進去吧~~所以跑出來的結果不對 真不好意思~~我剛碰
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-11-04 20:39:00 IP:221.169.xxx.xxx 未訂閱
int flag; while(flag==0) ... flag值未初始化,改成 int flag=0; while(flag==0) ... 就ok了 不過後面我測試的時候還發生一些錯誤,就自己先debug一下吧 我是建議既然c 那邊的code沒有問題,那就把影像值全部抓到某個陣列去,然後用c 的code去處理,再填到image2顯示
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-11-05 02:39:23 IP:163.28.xxx.xxx 未訂閱
報告justdo大大: 首先很謝謝您的幫忙^^ 您說的問題我有發現, 我也設定了起始值....可是他卻開始跑無窮回圈> < 請問您在測試時會有圖形出現嗎? 我後來有加入2維動態陣列進去,可是他卻不行跑圖了
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-11-05 22:28:28 IP:220.139.xxx.xxx 未訂閱
以下是我加了2維動態陣列後的程式..執行後的結果會出現警告標誌  
int **p;
p=(int**)malloc((bmp1->Height)*sizeof(int*));
 for(int i=0;iHeight;i++)
 {
  p[i]=(int*)malloc((bmp1->Width)*sizeof(int));
 }     for(int i=0;iHeight;i++)
     {
      ptr2 = (Byte *)bmp2->ScanLine[i];
      for(int j=0;jWidth;j++)
       {
        p[j][i]=ptr2[3*j];
       }
     }    int flag=0;
while(flag==0)
{
 flag=1;        for(int i=1;iHeight-1;i++)
     {
//      ptr2= (Byte *)bmp2->ScanLine[i];
      for(int j=1;jWidth-1;j++)
       {
        newlabel=p[j][i];
         if(p[j][i]>0)
          {
           for(y=i-1;y<=i+1;y++)
           {
             for(x=j-1;x<=j+1;x++)
             {
              if(p[y][x]0)
                 {                     newlabel=p[y][x];
                 flag=0;
                 }
               }
             }
           }
          p[j][i]=newlabel;
          }
       }
     }
for(int i=bmp1->Height-2;i>0;i--)
{
//  ptr2= (Byte *)bmp2->ScanLine[i];
  for(int j=bmp1->Width-2;j>0;j--)
 {
    newlabel=p[j][i];        if(p[j][i]>0)
  {
     for(y=i-1;y<=i+1;y++)
    {
     for(x=j-1;x<=j+1;x++)
     {
      if(p[y][x]0)
       {            newlabel=p[y][x];
        flag=0;
       }
      }
     }
    }
   p[j][i]=newlabel;
  }
 }
}
}  
我動態陣列寫錯了嗎? 麻煩各位大大了~~ 加進去以後執行程式會跑出 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=25325782&CC=566398"> 發表人 - akino0910 於 2005/11/05 22:30:26
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-11-06 22:17:43 IP:221.169.xxx.xxx 未訂閱
for(int i=0;iHeight;i  )
     {
      ptr2 = (Byte *)bmp2->ScanLine[i];
      for(int j=0;jWidth;j  )
       {
        p[j][i]=ptr2[3*j];
       }
     }
紅色的地方應該要為p[i][j] column在前、row在後,或者說高的索引在前,寬的索引在後 剛剛發現你c 那邊的code也都把row放在前、column放在後面,這樣是錯誤的 發表人 - justdo 於 2005/11/06 22:24:02
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-11-07 23:46:57 IP:140.135.xxx.xxx 未訂閱
報告justdo大大~~ 我有把行列問題掉換了... 可是他依舊跑出同樣的問題,同樣的警告... 差別在於沒改行列時,他只跑灰階值=1後就跑出警告訊號, 改了之後行列他會跑2次迴圈,就是灰階值=1跟灰階值=2的不份再跑出警告訊號 而且我發現....他跑灰階值=1的圖好像依舊沒有去做CCL的部份> <    
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-11-09 20:52:08 IP:221.169.xxx.xxx 未訂閱
你修改後的code呢?
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-11-10 00:21:05 IP:140.135.xxx.xxx 未訂閱
報告justdo大大 我後來又把它改成函式的方法...他到了flag那邊依舊是跑無窮回圈 以下是我的code  
for(int i=0;iHeight;i  )
           {
            ptr2=(Byte*) bmp2->ScanLine[i];
            for( int j=0;jWidth;j  )
            {
             p1[j][i]=ptr2[j*3];  
            }
           }
int flag=0;
while(flag==0)
{  flag=1;
      for(int i=1;iHeight-1;i  )
      {
        ptr2 = (Byte *)bmp2->ScanLine[i];
        for(int j=1;jWidth-1;j  )
        {
          newlabel=p1[j][i];
          if(p1[j][i]>0)
          {
            p1[j][i]=Mast(j,i);
            flag=0;
          }
        }
      }
      for(int i=bmp1->Height-2;i>0;i--)
      {
        ptr2 = (Byte *)bmp2->ScanLine[i];
        for(int j=bmp1->Width-2;j>0;j--)
        {
          newlabel=p1[j][i];
          if(p1[j][i]>0)
          {
            p1[j][i]=Mast(j,i);
            flag=0;
          }
        }
      }
    } 
下面是函式的code

int __fastcall TForm1::Mast(int i,int j)
{
 float newlabel;
 int p[10];
 p[1]=p1[i-1][j-1];
 p[2]=p1[i][j-1];
 p[3]=p1[i 1][j-1];
 p[4]=p1[i-1][j];
 p[5]=p1[i][j];
 p[6]=p1[i 1][j];
 p[7]=p1[i-1][j 1];
 p[8]=p1[i][j 1];
 p[9]=p1[i 1][j 1];     for(int x=1;x<9;x  )
 {
  for(int y=x 1;y<10;y  )
   {
   if(p[x]>0)
   {
    if(p[x]
還有就justdo大大說的把p[j][i]改成p[i][j]的話 程式執行到上面程式紅色那一行就停住了 我有在網路上看到taishyang大大的影像處裡的程式 (在編號40159處<-----不好意思,taishyang大大借我引用一下^^) 他也是寫p[j][i] 程式可以執行 現再我也有一點搞混了... 還請justdo大大的指教
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-11-14 08:19:58 IP:221.169.xxx.xxx 未訂閱
int **p;
p=(int**)malloc((bmp1->Height)*sizeof(int*));
 for(int i=0;iHeight;i  )
 {
  p[i]=(int*)malloc((bmp1->Width)*sizeof(int));
 }
以上配置出p[影像高][影像寬],所以以下程式碼
for(int i=0;iHeight;i  )
           {
            ptr2=(Byte*) bmp2->ScanLine[i];
            for( int j=0;jWidth;j  )
            {
             p[i][j]=ptr2[j*3];
            }
           }
p陣列使用時,要用p[高的索引][寬的索引],也就是p[i][j] 我測試以上程式碼,是ok的,反倒是使用p[j][i]會出問題 不知道為何你的情況會相反... 另外紅色那行p為何後來變成p1? taishyang大大的文章,注意看他陣列的宣告,是 int p1[640][480]; 也就是p1[影像寬][影像高],和你的情況不同 像他這種情況就要使用p1[寬的索引][高的索引] 基本上兩種方法都可以用,只是我建議用高在前、寬在後的方法 另外,對於旗標flag的用途,我還是不太能理解... 難道一次的up-down pass跟botton-up pass處理,無法完成CCL 所以需要多次反覆的up-down pass跟botton-up pass處理,直到沒有任何pixel有變化!? 最後Mast(int i,int j)這個函式有個問題 當p的9個元素都是0的時候,newlabel=p[x]不會被執行 也就是newlabel不會有被賦值的機會 return的時候,newlabel的值未定義 因此記得宣告newlabel的時候給予初值 還有,如果你這個函式只有要找出「非0的最小值」,只需要一個迴圈來處理就行了...(沒頭緒嗎?請參考你自己前面的c code)
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-11-17 19:55:01 IP:163.28.xxx.xxx 未訂閱
首先感謝justdo大大的回應^^ 這幾天我在忙實驗室的其他事> <,所以現在才回應~~不好意思     另外紅色那行p為何後來變成p1? 因為我跟taishyang大大ㄧ樣在程式的一開始就宣告一個全域的2維矩陣了, 另外,對於旗標flag的用途,我還是不太能理解... 難道一次的up-down pass跟botton-up pass處理,無法完成CCL 所以需要多次反覆的up-down pass跟botton-up pass處理,直到沒有任何pixel有變化!? 是的~~如果沒有寫flag迴圈就不能算是CCL了 因為要flag=0才會執行while迴圈... 一開始設flag=1意思是要while迴圈有跑到if......{ flag=0; }裡 才會再執行下一次while迴圈 沒有跑到if......{ flag=0; } 裡面的話..這時候flag還是1...當flag不等0的時候.就跳出while迴圈了 可是我就我的程式去DEBUG~~發現flag一直都是等於0 > < 最後Mast(int i,int j)這個函式有個問題 當p的9個元素都是0的時候,newlabel=p[x]不會被執行 不可能全都等於0,因為她前面有條件當p1[i][j]>0的時候才會跳入Mast函數裡面,所以最其碼回圈內的p[5]就ㄧ定不會為0了 也就是newlabel不會有被賦值的機會 return的時候,newlabel的值未定義 因此記得宣告newlabel的時候給予初值 還有,如果你這個函式只有要找出「非0的最小值」,只需要一個迴圈來處理就行了... 我剛剛發現我寫y好像沒有什麼意義@@ 我把函式裡面的程式改成這樣~~您看ㄧ下

int __fastcall TForm1::Mast(int i,int j)
{
 float newlabel;
 int p[10];
 p[1]=p1[i-1][j-1];
 p[2]=p1[i][j-1];
 p[3]=p1[i 1][j-1];
 p[4]=p1[i-1][j];
 p[5]=p1[i][j];
 p[6]=p1[i 1][j];
 p[7]=p1[i-1][j 1];
 p[8]=p1[i][j 1];
 p[9]=p1[i 1][j 1];     for(int x=1;x<9;x  )
 {
   if(p[x]>0)
   {
    if(p[x]
外面寫成
 
for(int i=0;iHeight;i  )
           {
            ptr2=(Byte*) bmp2->ScanLine[i];
            for( int j=0;jWidth;j  )
            {
             p1[i][j]=ptr2[j*3];  
            }
           }
int flag=0;
while(flag==0)
{  flag=1;
      for(int i=1;iHeight-1;i  )
      {
        ptr2 = (Byte *)bmp2->ScanLine[i];
        for(int j=1;jWidth-1;j  )
        {
          newlabel=p1[i][j];
          if(p1[i][j]>0)
          {
            p1[i][j]=Mast(i,j);
            flag=0;
            p1[i][j]=newlabel;
          }
        }
      }
      for(int i=bmp1->Height-2;i>0;i--)
      {
        ptr2 = (Byte *)bmp2->ScanLine[i];
        for(int j=bmp1->Width-2;j>0;j--)
        {
          newlabel=p1[i][j];
          if(p1[i][j]>0)
          {
            p1[i][j]=Mast(i,j);
            flag=0;//我寫了函式以後,flag釋放在這邊還是函式裡面?
            p1[i][j]=newlabel;//放這一行是因為C  的Code那邊可以對照,可是我不知道我寫了函式在這樣寫對不對
          }
        }
      }
    }               
        
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#20 引用回覆 回覆 發表時間:2005-11-18 21:29:17 IP:221.169.xxx.xxx 未訂閱
那還有遇到什麼問題嗎?    至於code還有些錯誤:
int __fastcall TForm1::Mast(int i,int j)
{
 float newlabel=p1[i][j]; //記得給初始值,不然p[0]-p[9]若都為0,傳回的newlabel值是未定義的
 int p[10];
 p[1]=p1[i-1][j-1];
 p[2]=p1[i][j-1];
 ...    while(flag==0)
{  flag=1;
      for(int i=1;iHeight-1;i  )
      {
        ptr2 = (Byte *)bmp2->ScanLine[i];//這行無用,可刪除
        for(int j=1;jWidth-1;j  )
        {
          newlabel=p1[i][j];
          if(p1[i][j]>0)
          {
            p1[i][j]=Mast(i,j);
            flag=0;
            p1[i][j]=newlabel;此行多餘,前兩行才指定Mast(i,j)給p1[i][j],現在又把他指定回原值?
          }
...
發表人 - justdo 於 2005/11/18 21:31:30
seiko
一般會員


發表:2
回覆:1
積分:0
註冊:2005-10-27

發送簡訊給我
#21 引用回覆 回覆 發表時間:2005-11-20 20:36:37 IP:220.138.xxx.xxx 未訂閱
flag的位置是不是有問題? 我是說回傳的地方 發表人 -
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#22 引用回覆 回覆 發表時間:2005-11-20 20:51:53 IP:220.138.xxx.xxx 未訂閱
真的很不好意思~~非常感謝justdo大大醫而再再而三不厭其煩的回答我的問題    我不懂為什麼ptr2那一行可以省略? BCB在做scanline時不是一定要這樣寫嗎?    還有就像seiko大大說的那樣.. 我不知道flag的回傳值寫在那邊是不是正確? 因為我的C++程式沒有寫函式...如果我寫在函式裡面是不是要再多寫一個return flag給主程式部分呢? 因為我的程式依舊沒有跑出flag迴圈> <...DEBUG的值一直都是0阿
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#23 引用回覆 回覆 發表時間:2005-11-21 20:17:52 IP:221.169.xxx.xxx 未訂閱
引言: 我不懂為什麼ptr2那一行可以省略? BCB在做scanline時不是一定要這樣寫嗎?
因為在那個while迴圈內,ptr2已經沒有任何用途了
引言: 還有就像seiko大大說的那樣.. 我不知道flag的回傳值寫在那邊是不是正確? 因為我的C 程式沒有寫函式...如果我寫在函式裡面是不是要再多寫一個return flag給主程式部分呢?
你的flag用途在於判斷是否要離開while迴圈,並不需要return回去呀..
引言: 因為我的程式依舊沒有跑出flag迴圈> <...DEBUG的值一直都是0阿 < face="Verdana, Arial, Helvetica"> 你之前的c code不是可以跑完嗎? @@
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#24 引用回覆 回覆 發表時間:2005-11-22 00:24:01 IP:220.138.xxx.xxx 未訂閱
感謝justdo大大的回應~~ 因為在那個while迴圈內,ptr2已經沒有任何用途了 這句話是什麼意思?怎麼會沒用途了呢? 不是一樣有去跑Height 跟 Width嗎? 我不懂> < 還請justdo大大的指導 我的程式在C code事可以跑完~~可是我改到BCB這邊來就不能跑了 這...一直都是我的問題所在@@ 不知道justdo大大有沒有發現異狀 > < 我被這問題困擾好久了...
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#25 引用回覆 回覆 發表時間:2005-11-23 23:23:15 IP:221.169.xxx.xxx 未訂閱
引言: 感謝justdo大大的回應~~ 因為在那個while迴圈內,ptr2已經沒有任何用途了 這句話是什麼意思?怎麼會沒用途了呢? 不是一樣有去跑Height 跟 Width嗎? 我不懂> < 還請justdo大大的指導
你搜尋一下ptr2,就可以發現,在while迴圈內,你除了賦予值給他之外,並沒有拿ptr2做任何事情,而Height跟Width是從img1取得的,跟ptr2毫無關係(我是指沒有直接關係...)
引言: 我的程式在C code事可以跑完~~可是我改到BCB這邊來就不能跑了 這...一直都是我的問題所在@@ 不知道justdo大大有沒有發現異狀 > < 我被這問題困擾好久了...
我也不太能理解,你已經成功的把影像資料讀到p1陣列去了 只要把p1陣列當成buff陣列,接C 那部分的code就應該沒問題了才對呀 (當然前提是c 那部分的code是正確的) 或者把C 那部分的code包成一個函式來呼叫, 還有什麼問題的話,只好麻煩你把整個project壓縮上傳囉
akino0910
一般會員


發表:34
回覆:52
積分:16
註冊:2005-09-30

發送簡訊給我
#26 引用回覆 回覆 發表時間:2005-12-07 20:21:48 IP:140.135.xxx.xxx 未訂閱
報告justdo大大... 真不好意思~~最近實驗室事情一堆,我又一直在測試我的問題~~依舊沒有成果 > <".....有夠沮喪的... 還是很感謝您一而再再而三的幫忙... 很笨的我會再繼續試看看...如果真的用不出來~~在請您繼續來替我解惑^^ 感激不盡~~
系統時間:2024-05-07 17:39:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!