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

關於將BMP圖檔的RGB全部存在一個陣列中

尚未結案
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-06 22:44:33 IP:163.13.xxx.xxx 未訂閱
請問各位我現在是寫一個將RGB全部存在同一個陣列中的,來做標準差的計算。 程式寫成功了,跑出來也是對的。 問題1.StdDev(constdouble * Data, const int Data_Size) 中的Data_Size指       的應該是陣列大小吧,我的程式中Data_Size應該是921600       (640*480*3),但是我如果寫成Edit9->Text=FloatToStr(StdDev       (b,921600));的話,只會秀出NAN而已。改成307200(640*480)的話,就       沒問題,為什麼勒??? 問題2.我現在程式只能對640*480的BMP做標準差的計算,有什麼方法可以讓我       的程式也可以對不同解析度做運算,增加程式的可用性。       我目前寫成以下的程式但是編譯時過不了,請問這樣寫對嗎???     
   
    double b[(Image1->Picture->Height*Image1->Picture->Width*3)];
   for (int i=0;iPicture->Height;i  )
   {
      ptr = (Byte *)Image1->Picture->Bitmap->ScanLine[i];
      for (int j=0;jPicture->Width;j  )
      {             int B = ptr[j*3];
         int G = ptr[j*3 1];
         int R = ptr[j*3 2];
         a=a (R G B)/3;
         b[k*3]=B;
         b[k*3 1]=G;
         b[k*3 2]=R;
         if(k<(Image1->Picture->Height*Image1->Picture->Width)){
         k  ;
         }
       }
   }
          Edit9->Text=FloatToStr(StdDev(b,(Image1->Picture-
                                    >Height*Image1->Picture->Width));
可以WORK的程式
double b[921600];//640*480*3
   for (int i=0;iPicture->Height;i  )
   {
      ptr = (Byte *)Image1->Picture->Bitmap->ScanLine[i];
      for (int j=0;jPicture->Width;j  )
      {             int B = ptr[j*3];
         int G = ptr[j*3 1];
         int R = ptr[j*3 2];
         a=a (R G B)/3;
         b[k*3]=B;
         b[k*3 1]=G;
         b[k*3 2]=R;
         if(k<307200){
         k  ;
         }
       }
   }
          Edit9->Text=FloatToStr(StdDev(b,307200));
richtop
資深會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-06 23:31:54 IP:211.76.xxx.xxx 未訂閱
iii0628 您好:    有兩個建議:    1.如果您只要算出標準差,可以直接在函式中計算,不必將資料存入陣列,再用以為參數呼叫StdDev(.)。另外不知道StdDev(.)的傳回值是什麼?檢查一下是不是float/double,或許就能解決您的問題。 2.如果您一定要先產生陣列,建議是用動態記憶體的方式為之,相關使用範例站上有很多可參考。    
引言: 請問各位我現在是寫一個將RGB全部存在同一個陣列中的,來做標準差的計算。 程式寫成功了,跑出來也是對的。 問題1.StdDev(constdouble * Data, const int Data_Size) 中的Data_Size指 的應該是陣列大小吧,我的程式中Data_Size應該是921600 (640*480*3),但是我如果寫成Edit9->Text=FloatToStr(StdDev (b,921600));的話,只會秀出NAN而已。改成307200(640*480)的話,就 沒問題,為什麼勒??? 問題2.我現在程式只能對640*480的BMP做標準差的計算,有什麼方法可以讓我 的程式也可以對不同解析度做運算,增加程式的可用性。 我目前寫成以下的程式但是編譯時過不了,請問這樣寫對嗎???
   
    double b[(Image1->Picture->Height*Image1->Picture->Width*3)];區域陣列變數的大小宣告需要是常數。
   for (int i=0;iPicture->Height;i  )
   {
      ptr = (Byte *)Image1->Picture->Bitmap->ScanLine[i];
      for (int j=0;jPicture->Width;j  )
      {             int B = ptr[j*3];
         int G = ptr[j*3 1];
         int R = ptr[j*3 2];
         a=a (R G B)/3;
         b[k*3]=B;
         b[k*3 1]=G;
         b[k*3 2]=R;
         if(k<(Image1->Picture->Height*Image1->Picture->Width)){
         k  ;
         }
       }
   }
          Edit9->Text=FloatToStr(StdDev(b,(Image1->Picture-
                                    >Height*Image1->Picture->Width));
可以WORK的程式
double b[921600];//640*480*3 )];區域陣列變數的大小為常數。
   for (int i=0;iPicture->Height;i  )
   {
      ptr = (Byte *)Image1->Picture->Bitmap->ScanLine[i];
      for (int j=0;jPicture->Width;j  )
      {             int B = ptr[j*3];
         int G = ptr[j*3 1];
         int R = ptr[j*3 2];
         a=a (R G B)/3;
         b[k*3]=B;
         b[k*3 1]=G;
         b[k*3 2]=R;
         if(k<307200){
         k  ;
         }
       }
   }
          Edit9->Text=FloatToStr(StdDev(b,307200));
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-06 23:52:46 IP:163.13.xxx.xxx 未訂閱
大大你好:1.請問你說直接在函式中計算是什麼意思???可以再麻煩說明一下,             還是大大可以方便寫個小程式???讓我參考...           2.我寫這程式目的就是只要算出標準差而已,寫成陣列是方便我在             做不同解析度的StdDev(.)函式時,可以知道Data_Size的大小,             如果不寫成陣列的還有什麼方法可以用...             希望大大可以回答一下                                                                  謝謝             
引言: iii0628 您好: 有兩個建議: 1.如果您只要算出標準差,可以直接在函式中計算,不必將資料存入陣列,再用以為參數呼叫StdDev(.)。另外不知道StdDev(.)的傳回值是什麼?檢查一下是不是float/double,或許就能解決您的問題。 2.如果您一定要先產生陣列,建議是用動態記憶體的方式為之,相關使用範例站上有很多可參考。
引言: 請問各位我現在是寫一個將RGB全部存在同一個陣列中的,來做標準差的計算。 程式寫成功了,跑出來也是對的。 問題1.StdDev(constdouble * Data, const int Data_Size) 中的Data_Size指 的應該是陣列大小吧,我的程式中Data_Size應該是921600 (640*480*3),但是我如果寫成Edit9->Text=FloatToStr(StdDev (b,921600));的話,只會秀出NAN而已。改成307200(640*480)的話,就 沒問題,為什麼勒??? 問題2.我現在程式只能對640*480的BMP做標準差的計算,有什麼方法可以讓我 的程式也可以對不同解析度做運算,增加程式的可用性。 我目前寫成以下的程式但是編譯時過不了,請問這樣寫對嗎???
   
    double b[(Image1->Picture->Height*Image1->Picture->Width*3)];區域陣列變數的大小宣告需要是常數。
   for (int i=0;iPicture->Height;i  )
   {
      ptr = (Byte *)Image1->Picture->Bitmap->ScanLine[i];
      for (int j=0;jPicture->Width;j  )
      {             int B = ptr[j*3];
         int G = ptr[j*3 1];
         int R = ptr[j*3 2];
         a=a (R G B)/3;
         b[k*3]=B;
         b[k*3 1]=G;
         b[k*3 2]=R;
         if(k<(Image1->Picture->Height*Image1->Picture->Width)){
         k  ;
         }
       }
   }
          Edit9->Text=FloatToStr(StdDev(b,(Image1->Picture-
                                    >Height*Image1->Picture->Width));
可以WORK的程式
double b[921600];//640*480*3 )];區域陣列變數的大小為常數。
   for (int i=0;iPicture->Height;i  )
   {
      ptr = (Byte *)Image1->Picture->Bitmap->ScanLine[i];
      for (int j=0;jPicture->Width;j  )
      {             int B = ptr[j*3];
         int G = ptr[j*3 1];
         int R = ptr[j*3 2];
         a=a (R G B)/3;
         b[k*3]=B;
         b[k*3 1]=G;
         b[k*3 2]=R;
         if(k<307200){
         k  ;
         }
       }
   }
          Edit9->Text=FloatToStr(StdDev(b,307200));
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-07 10:22:26 IP:220.130.xxx.xxx 未訂閱
1.原來是我函式用錯了,我是對整張圖做標準差計算的話是要用PopnStdDev,   所以我Data_Size是921600就沒錯。....StdDev是抽樣用的 2.問題2還沒解決    
引言: iii0628 您好: 有兩個建議: 1.如果您只要算出標準差,可以直接在函式中計算,不必將資料存入陣列,再用以為參數呼叫StdDev(.)。另外不知道StdDev(.)的傳回值是什麼?檢查一下是不是float/double,或許就能解決您的問題。 2.如果您一定要先產生陣列,建議是用動態記憶體的方式為之,相關使用範例站上有很多可參考。
引言: 請問各位我現在是寫一個將RGB全部存在同一個陣列中的,來做標準差的計算。 程式寫成功了,跑出來也是對的。 問題1.StdDev(constdouble * Data, const int Data_Size) 中的Data_Size指 的應該是陣列大小吧,我的程式中Data_Size應該是921600 (640*480*3),但是我如果寫成Edit9->Text=FloatToStr(StdDev (b,921600));的話,只會秀出NAN而已。改成307200(640*480)的話,就 沒問題,為什麼勒??? 問題2.我現在程式只能對640*480的BMP做標準差的計算,有什麼方法可以讓我 的程式也可以對不同解析度做運算,增加程式的可用性。 我目前寫成以下的程式但是編譯時過不了,請問這樣寫對嗎???
   
    double b[(Image1->Picture->Height*Image1->Picture->Width*3)];區域陣列變數的大小宣告需要是常數。
   for (int i=0;iPicture->Height;i  )
   {
      ptr = (Byte *)Image1->Picture->Bitmap->ScanLine[i];
      for (int j=0;jPicture->Width;j  )
      {             int B = ptr[j*3];
         int G = ptr[j*3 1];
         int R = ptr[j*3 2];
         a=a (R G B)/3;
         b[k*3]=B;
         b[k*3 1]=G;
         b[k*3 2]=R;
         if(k<(Image1->Picture->Height*Image1->Picture->Width)){
         k  ;
         }
       }
   }
          Edit9->Text=FloatToStr(StdDev(b,(Image1->Picture-
                                    >Height*Image1->Picture->Width));
可以WORK的程式
double b[921600];//640*480*3 )];區域陣列變數的大小為常數。
   for (int i=0;iPicture->Height;i  )
   {
      ptr = (Byte *)Image1->Picture->Bitmap->ScanLine[i];
      for (int j=0;jPicture->Width;j  )
      {             int B = ptr[j*3];
         int G = ptr[j*3 1];
         int R = ptr[j*3 2];
         a=a (R G B)/3;
         b[k*3]=B;
         b[k*3 1]=G;
         b[k*3 2]=R;
         if(k<307200){
         k  ;
         }
       }
   }
          Edit9->Text=FloatToStr(StdDev(b,307200));
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
1666362
初階會員


發表:66
回覆:124
積分:43
註冊:2004-07-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-07 12:23:19 IP:61.222.xxx.xxx 未訂閱
用比較簡單的想法 假設你已經知道 最大解析度為640*480 那可以先宣告3個陣列 把陣列內容先設定為0 分別為 int R[640][480]={0}, G[640][480]={0}, B[640][480]={0}; 然後讀取出 pixel分別存入 再用這3陣列去做標準差運算
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-07 12:54:05 IP:220.130.xxx.xxx 未訂閱
1666362你好,我已經將程式修改好了,但是現在的問題是編譯過之後,我LOAD BMP檔進來就會出現Access Violation at address 32665A01 in Module 'std.exe'Read of address '0000000C'....等訊息。爬文之後,我也將aryPtr=NULL宣告好了,不過還是會出現這類訊息,麻煩幫我看一下code好嗎???我實在是找不出還可以修改什麼了,謝謝    
double *aryPtr=NULL;
    aryPtr = new  double[Image1->Picture->Height*Image1->Picture->Width*3];
   if (OpenPictureDialog1->Execute())
   {
      Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
   }
      Image1->Picture->Bitmap->PixelFormat = pf24bit;
      byte *ptr=NULL;
    for (int i=0;iPicture->Height;i  )
   {
      ptr = (Byte *)Image1->Picture->Bitmap->ScanLine[i];
      for (int j=0;jPicture->Width;j  )
      {             int B = ptr[j*3];
         int G = ptr[j*3 1];
         int R = ptr[j*3 2];             aryPtr[k*3]=(double)B;
         aryPtr[k*3 1]=(double)G;
         aryPtr[k*3 2]=(double)R;
         a=a (R G B)/3;
         if(k<(Image1->Picture->Height*Image1->Picture->Width)){
         k  ;             }
       }
   }             Edit9->Text=FloatToStr(PopnStdDev(aryPtr,Image1->Picture->Height*Image1->Picture->Width*3));
引言: 用比較簡單的想法 假設你已經知道 最大解析度為640*480 那可以先宣告3個陣列 把陣列內容先設定為0 分別為 int R[640][480]={0}, G[640][480]={0}, B[640][480]={0}; 然後讀取出 pixel分別存入 再用這3陣列去做標準差運算
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-07 15:49:52 IP:220.130.xxx.xxx 未訂閱
問題已經解決,我把陣列名稱設成別的名稱就OK!!!真的是看到鬼
系統時間:2024-05-12 23:55:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!