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

請問關於 if 敘述的判斷...是否有啥限制呢?

答題得分者是:richtop
xdio2
一般會員


發表:60
回覆:29
積分:17
註冊:2004-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-07 03:38:31 IP:61.59.xxx.xxx 未訂閱
小弟現在正在做很粗糙的車牌字元切割 想法很簡單,因為車牌為六個字元加上一個橫槓 若是沒有那個橫槓,那車牌字元的間距都會是一樣 就是因為加上了那個橫槓,且橫槓的大小跟字元大小不一樣 導致之後的車牌字元位置都會有變化 小弟先假設,在我擷取出來的畫面裡 大約長度六分之一的部分,都可以包含一個字元, 至於有沒有包含那個橫槓,我就先不管了 因為我怕把抓到的車牌字元畫面直接切六份 會導致字元被切的不完整 所以我在每個六分之一的點,往右邊再搜尋大約十個像素的位置 (因為加了橫槓,會導致車牌的位置大於六分之一的倍數,小弟的意思是:本來第三個字元也許是在(車牌六分之一*3)的長度位置找到起點,但因為加入了橫槓,使得真正起點的位置更右邊,所以我就只往右邊擴大搜尋範圍)    但是今天我在一個if敘述的地方發生奇怪的狀況 就是下方紅色程式碼的部分,若是改寫成紫色的部分則會發生錯誤    寫紅色部分的程式碼所造成的效果 但寫成紫色部分卻變成這樣 p.s.小弟處理的圖片是已經經過二值化的了 以下是小弟使用的圖片 請各位大大幫忙解惑一下 感謝~
 
//視窗左邊是Image1來載入我要處理的圖片
//視窗右邊的Image2則是載入處理後的樣子    Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Assign(Image1->Picture->Bitmap);    Bmp->Canvas->Pen->Width=1;
Bmp->Canvas->Pen->Color=clRed;    //開始從車牌每個六分之一長度找東西
for(int i=0;iWidth;i=i+(Bmp->Width)/6)
{
 //這個 p 陣列是用來紀錄每次在六分之一長度往右十像素內,每一行的黑白像素值
 float p[10][2]={0};
 int s=0;     for(int x=i;xHeight;j++)
  {
   if(GetRValue(Bmp->Canvas->Pixels[x][j])==clBlack)
   //黑色像素我紀錄在p[s][0]的位置
   p[s][0]++;
   
   else
   //白色像素我紀錄在p[s][1]的位置,不過後來我好像沒用到....
   p[s][1]++;
  }
   s++;
 }     //接下來我要找當行黑色像素比例最低的,使他當min     //先把min設很大
 float min=Bmp->Height;     for(int s1=0;s1Height))<=min)
 min=p[s1][0]/(float)(Bmp->Height);
 }     //之後在比對跟min值相同的黑色像素比例,要是符合,我就劃下一條紅線,也就是我認為的字元間隔
 for(int s1=0;s1
   float x=p[s1][0]/(float)(Bmp->Height);
   if(x==(min))
   {
     Bmp->Canvas->MoveTo(i+s1,0);
     Bmp->Canvas->LineTo(i+s1,Bmp->Height);
   }
   
   
   //上面這個紅色部分若是整個替換成
   // if(p[s1][0]/(float)(Bmp->Height)==(min))
   //   {
   //     Bmp->Canvas->MoveTo(i+s1,0);
   //     Bmp->Canvas->LineTo(i+s1,Bmp->Height);
   //   }
   //程式碼就會跑出錯誤的效果,效果請見上面小弟附的圖
   
   
}    }    Image2->Picture->Bitmap->Assign(Bmp);    delete Bmp;    
發表人 - xdio2 於 2004/11/07 03:40:46 發表人 - xdio2 於 2004/11/07 03:42:43 發表人 - xdio2 於 2004/11/07 03:44:12
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-07 10:13:16 IP:61.64.xxx.xxx 未訂閱
看起來像是運算子優先順序的問題, 改成這樣試試    if(( p[s1][0]/(float)(Bmp->Height) ) ==(min))
xdio2
一般會員


發表:60
回覆:29
積分:17
註冊:2004-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-07 12:49:11 IP:61.59.xxx.xxx 未訂閱
引言: 看起來像是運算子優先順序的問題, 改成這樣試試 if(( p[s1][0]/(float)(Bmp->Height) ) ==(min))
多謝你的回覆喔 不過改成你說的那樣...效果還是一樣是錯誤的哩 即使改成下面這樣,效果也是錯誤的 if((float)( p[s1][0]/(float)(Bmp->Height) ) ==(float)(min)) 一定得把 p[s1][0]/(float)(Bmp->Height) 拉出來才行 為何會這樣呢.... 麻煩各位大大幫小弟解惑一下 感謝~
richtop
資深會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-07 15:11:18 IP:211.76.xxx.xxx 未訂閱
xdio2 您好:    根據之前的經驗,浮點數因儲存的有效位數有限,所以會出現捨去誤差,所以要讓浮點數完全相等,有時會有困難。 因此一個變通的方法是:利用兩浮點數差的絶對值是否小於一個設定的容許誤差,來判斷兩數的接近程度。    簡單修改,應該能讓您繼續接下來要完成的事。    

    //上面這個紅色部分若是整個替換成
    float eps = 1e-3; // 可依需要自定
    if( abs( p[s1][0]/(float)(Bmp->Height)-(min) ) < eps )
      {
        Bmp->Canvas->MoveTo(i s1,0);
        Bmp->Canvas->LineTo(i s1,Bmp->Height);
      }
   //程式碼就會跑出錯誤的效果,效果請見上面小弟附的圖

RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
系統時間:2024-06-02 1:18:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!