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

錯誤--Invalid floating point operation

尚未結案
dean
一般會員


發表:24
回覆:60
積分:21
註冊:2003-08-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-23 16:48:40 IP:192.192.xxx.xxx 未訂閱
各位前輩好: 小弟寫rgb轉hsv的程式,那寫的過程有發生問題,但似乎是浮點數的問題,但小弟檢查程式實在不知道哪邊出錯,可否請各位前輩指點小弟。 〔Code〕 void __fastcall TForm1::RGB2HSV2Click(TObject *Sender) {    Byte *ptr;    double R,G,B,H,H1;    Graphics::TBitmap *Bmp = new Graphics::TBitmap();    Bmp->Assign(Image1->Picture->Bitmap);    Bmp->PixelFormat = pf8bit;    for (int i=0;iHeight;i ) { ptr = (Byte *)Bmp->ScanLine[i]; for (int j=0;jWidth;j ) { B = ptr[i*3]; G = ptr[i*3 1]; R = ptr[i*3 2]; ***** H1=acos(0.5*((R-G) (R-B)) / sqrt(((R-G)*(R-G) (R-B)*(G-B)))) ; ***** //就是這一行發生錯誤,錯誤說:Invalid floating point operation ptr[i*3] = H1; //測試而已 ptr[i*3 1] = H1; ptr[i*3 2] = H1; } } Image2->Picture->Assign(Bmp); } 〔/code〕 但我有宣告變數為double,也有加上math.h,不知為何會出現錯誤?
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-23 16:54:17 IP:140.135.xxx.xxx 未訂閱
dean您好:   請參考下面聯結做適當的修改 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37787 謝謝您的配合 >~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
zen
一般會員


發表:0
回覆:3
積分:5
註冊:2003-02-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-24 00:21:18 IP:211.76.xxx.xxx 未訂閱
您好,這種情形發生在某點的RGB值皆相同時(分母會等於零) 解決辦法是加上一條件,若R=G=B就直接將H設為0,不要向下算H -- 這裡真是個溫暖的地方阿…
dean
一般會員


發表:24
回覆:60
積分:21
註冊:2003-08-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-24 23:19:01 IP:211.76.xxx.xxx 未訂閱
兩位前輩您好: 小弟根據您們的建議修改了程式,後來程式在經過多番修改後可以跑了,但小弟仍有下列問題: 1.轉換成hsv後,那是什麼格式呢?是".BMP"嗎? 2.這樣子有沒有轉成hsv呢?將圖放入並且比較,似乎沒有任何改變。 3.Byte HSV[512][3][384]``到底用byte好還適用double好?因為兩個我試的結果都一樣!還有hsv的[512][3][384]這樣寫是對的ㄇ? 4.若我只要取h出來,那應該怎麼表現顯示在新圖中哩? ***這一個是從一本影像處理的書上擷取下來的,小弟只能先從模仿開始學習影像處理,因為以前沒有碰觸過,不好意思。小弟是有改一點,因為本來是c,若有怪怪請糾正小弟,小弟會虛心學習的。 ***
 void __fastcall TForm1::RGB2HSV2Click(TObject *Sender)
{
   int i,j,k,ppp=1,KKK=1;
   Byte *ptr;
   double R,G,B,H1,Max,min,PI=3.1415926;
   Byte HSV[512][3][384];
   Graphics::TBitmap *Bmp = new Graphics::TBitmap();
   Bmp->Assign(Image1->Picture->Bitmap);
   //Bmp->PixelFormat = pf24bit;       for (i=0;iHeight;i++)
   {
      ptr = (Byte *)Bmp->ScanLine[i];
      for (j=0;jWidth;j++)
      {
         B = ptr[i*3];
         G = ptr[i*3+1];
         R = ptr[i*3+2];
         //求RGB的MAX和MIN
         k=0;
         Max = R;
         min = R;
         if (Max <= G)
            Max = G;
         else
            min = G;
         if (Max <= B)
            Max = B;
         else
            min = B;
         //求色調
         if (R==G && R==B && G==B)
         {   H1 =0;
            Edit1->Text = ppp++;    //測試看幾次為相同
            Label2 -> Caption = R;
            Label3 -> Caption = G;
            Label4 -> Caption = B;
         }
         else
            H1=acos(0.5*((R-G)+(R-B))/sqrt(((R-G)*(R-G)+(R-B)*(G-B))));             if (B <= G)
            HSV[k][i][j] = H1;
         else
            HSV[k][i][j] = 2*PI-H1;
         K++;
         //求飽和度S
         HSV[k][i][j] = (Max-min)/Max;
         k++;
         //求明亮度v
         HSV[k][i][j] = Max/255;
         k++;
         KKK++;
         Edit2->Text=KKK;   //測試跑多少次
      }
   }
   Image2->Picture->Assign(Bmp);
   Image2->AutoSize = true;
   Edit1->Text = "OK..Finish";
}
dean
一般會員


發表:24
回覆:60
積分:21
註冊:2003-08-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-24 23:31:38 IP:211.76.xxx.xxx 未訂閱
抱歉解釋一下,這張圖雖然有點噁心,但小弟只是想找一張有光源的圖,因為HSV若我記的沒錯應該是把光源跟色調分開吧,是不是? 我問過我一些朋友,有人覺得右邊的眼睛比較亮,左邊的眼睛比較暗,但也有朋友覺得都一樣。請各位前被幫小弟看一下到底有沒有轉換成HSV。謝謝
taishyang
站務副站長


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-25 16:32:07 IP:140.135.xxx.xxx 未訂閱
dean您好:
引言: 1.轉換成hsv後,那是什麼格式呢?是".BMP"嗎? 2.這樣子有沒有轉成hsv呢?將圖放入並且比較,似乎沒有任何改變。 3.Byte HSV[512][3][384]``到底用byte好還適用double好?因為兩個我試的結果都一樣!還有hsv的[512][3][384]這樣寫是對的ㄇ? 4.若我只要取h出來,那應該怎麼表現顯示在新圖中哩?
1.不是BMP格式
  BMP格式請參考下面連結
  http://nova.bime.ntu.edu.tw/~ttlin/Course01/c1tech_document.htm
2.H的範圍是0~360,S的範圍是0~1,V我忘記了(好像是1~-1)
  您可以看看數據經由公式反推得知沒有轉成功壓< >
>
順心< >    <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
        
dean
一般會員


發表:24
回覆:60
積分:21
註冊:2003-08-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-09-25 16:33:42 IP:192.192.xxx.xxx 未訂閱
應該說是hsv模式中的色調h比較不容易受到光的影響。 但yiq也可以避免亮度的影響阿,那到底哪些模式對光的影響比較小呢?也就是不太會受光的影響? 小弟有太多問題想請教各位前輩,請前輩們解開小弟疑惑,謝謝!
taishyang
站務副站長


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-09-25 16:47:47 IP:140.135.xxx.xxx 未訂閱
dean您好:
引言: 應該說是hsv模式中的色調h比較不容易受到光的影響。 但yiq也可以避免亮度的影響阿,那到底哪些模式對光的影響比較小呢?也就是不太會受光的影響?
EX. HSI ,YCrCb...等,凡是將亮度的分量獨立出來的色彩模型,也就比較不容易受到光的影響 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-09-25 17:09:16 IP:210.68.xxx.xxx 未訂閱
各位好: 插花一下喔! 在windows模式下,顯示色彩都是RGB,不管轉成什麼模式,要顯示色彩都要轉成 RGB才能顯示,所以看到的結果一定是一樣的,不是嗎?
taishyang
站務副站長


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-09-25 17:23:38 IP:140.135.xxx.xxx 未訂閱
看dean會員的程式並沒有改變bmp的內容 而直接將bmp assign給Image2 所以Image1與Image2的畫面應該是一樣的吧 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
kikikoko
一般會員


發表:4
回覆:8
積分:2
註冊:2003-05-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-09-26 13:21:09 IP:61.59.xxx.xxx 未訂閱
如同JerryKuo版主所說的"在windows模式下, 示色彩都是RGB,不管轉成什麼模式,要顯示色彩 都要轉成RGB才能顯示,所以看到的結果一定是 一樣的" 若要比較兩張圖的亮度應該是轉成HSV後直接比較 H值的大小,一張圖轉成RGB或SHV只是在二種不同 的color model之間轉換而已,對圖形並不會有 任何的改變。 發表人 - kikikoko 於 2003/09/26 13:22:47
taishyang
站務副站長


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-09-26 14:01:32 IP:140.135.xxx.xxx 未訂閱
大家好:   要顯示HSI的效果,Ex.H分量,範圍是0~360   要顯示出來就必須正規化到0~255,再映射到BMP或Image上   而dean會員第一個程式則沒有做正規化的動作   第二個程式映射與正規化都沒做,直接將原圖的bmp assign給Image2   結果自然與原圖相同    順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
dean
一般會員


發表:24
回覆:60
積分:21
註冊:2003-08-23

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-09-29 17:55:38 IP:192.192.xxx.xxx 未訂閱
各位前輩好: 小弟今天問過老師關於顯示方面問題,老師說若我是RGB->HSV只是格式的轉換,而不是"處理",若是前者,那要在顯示器上顯示則沒有多大的變化,應該也看不出來。JerryKuo與kikikoko兩位所解釋的則與老師一樣。感謝^^ 那請教taishyang,您說要正規化,我上網找影像正規化或圖形正規化,不知道是我看不懂還是找不到,我不知道要怎麼把hsv[][][]內的值給正規化,要正規化從0-360的hsv到0-255的rgb應該是有一個既定的公式吧!? ---直接將bmp assign給Image2,所以Image1與Image2的畫面應該是一樣的---- 對的,我後來檢查我的程式,我發現我的確適用tbitamp型態的bmp去給image1跟2,後來我怎麼想辦法把轉換後的hsv去assign給Bmp,在用Image2->Picture->Assign(Bmp);把它秀出來,還是沒有辦法!不知這部分該怎麼解決? 若想把h取出來要怎麼取?像要取rgb其中值,只要B = ptr[i*3]; G = ptri*3 1];R = ptr[i*3 2];就可以取出來,那hsv要怎麼取? **我很想學,但又很不懂,所以一直問蠢問題,希望不要不屑我的問題,嘻嘻嘻**
taishyang
站務副站長


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-09-29 18:39:20 IP:140.135.xxx.xxx 未訂閱
dean您好: 您誤會我的意思了,我的意思與JerryKuo版主和kikikoko會員是一樣的 我指的效果是指H的範圍映射到RGB範圍的灰階效果 我曾在一篇全國碩博士論文中有看到此效果,待我找到再PO上連結 請查詢
論文名稱: 以數位影像處理技術做人臉自動追蹤系統之研究 
國家圖書館索書號: 448 007M 89-74 系統編號: 88NCKU0442160 
     出版年: 民89 
     研究生: 譚永恆 
當中第三章第7頁
引言: 若想把h取出來要怎麼取?像要取rgb其中值,只要B = ptr[i*3]; G = ptri*3 1];R = ptr[i*3 2];就可以取出來,那hsv要怎麼取?
將RGB代入您的轉換公式即可得知HSV的值為何 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-09-30 10:39:09 IP:61.230.xxx.xxx 未訂閱
引言: 各位前輩好: 那請教taishyang,您說要正規化,我上網找影像正規化或圖形正規化,不知道是我看不懂還是找不到,我不知道要怎麼把hsv[][][]內的值給正規化,要正規化從0-360的hsv到0-255的rgb應該是有一個既定的公式吧!? ---直接將bmp assign給Image2,所以Image1與Image2的畫面應該是一樣的---- 對的,我後來檢查我的程式,我發現我的確適用tbitamp型態的bmp去給image1跟2,後來我怎麼想辦法把轉換後的hsv去assign給Bmp,在用Image2->Picture->Assign(Bmp);把它秀出來,還是沒有辦法!不知這部分該怎麼解決? 若想把h取出來要怎麼取?像要取rgb其中值,只要B = ptr[i*3]; G = ptri*3 1];R = ptr[i*3 2];就可以取出來,那hsv要怎麼取? **我很想學,但又很不懂,所以一直問蠢問題,希望不要不屑我的問題,嘻嘻嘻**
離題囉~,再開個新主題討論吧
n890377
一般會員


發表:17
回覆:16
積分:21
註冊:2006-07-13

發送簡訊給我
#16 引用回覆 回覆 發表時間:2006-07-11 10:02:36 IP:163.22.xxx.xxx 未訂閱

你的問題可以參考以下這位大大的程式:

http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=71119

------
.
系統時間:2024-05-02 21:35:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!