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

我對一張影像的每一個pixel都做統計圖~但是卻畫不出來

尚未結案
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-14 15:33:26 IP:218.175.xxx.xxx 未訂閱
各位大大~我對一張影像的每一個pixel的rgb都做統計圖來累加它的值 但是卻畫不出來~不知那裡有誤~希望各位大大能幫我找一下 這是我的code    
//-------------------------------------------------------------------
#include 
#include
#pragma hdrstop
#include "Unit1.h"
//-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define ImageWidth 320     //影像處理之寬度
#define ImageHeight 240    //影像處理之高度
int rgb[3][ImageWidth][256]={0};
//-------------------------------------------------------------------
void showRGBHistogram(TImage *image, TCanvas *canvas)
{ Byte * ptr;
  int r, g, b,index;
  image->Picture->Bitmap->PixelFormat = pf24bit;
  for (int row=0; rowPicture->Bitmap->ScanLine[row];
       index = 0;
       for (int col=0; colPen->Color = colors[p];
        canvas->MoveTo(0,(rgb[p][col][0]));
        for (int x=1; x<256; x  )
          {
           canvas->LineTo(x, (int)(rgb[p][col][x]));
          }
        }
     }
}
//-------------------------------------------------------------------
發表人 - dragonhippopdc 於 2005/02/14 19:52:59
JerryKuo
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-14 17:53:55 IP:220.135.xxx.xxx 未訂閱
發表程式請參考版規說明 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=47262 [code] // BCB, Delphi 的程式碼 [/code] 敬請合作
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-14 19:53:29 IP:220.133.xxx.xxx 未訂閱
抱歉板主~我下次會注意的
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-14 20:38:25 IP:220.133.xxx.xxx 未訂閱
我發現我貼的code有點寫錯~我現在修正了一下但是還是有問題 各位大大~假設我一段320*240的影像~而我想對每一個frame的每一個pixel的rgb的值做累加請問我貼的這段code那裡出了問題呢~為什麼我一執行電腦的記憶體就被吃光然後死當了~
//-------------------------------------------------------------------
#include 
#include
#pragma hdrstop
#include "Unit1.h"
//-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define ImageWidth 320     //影像處理之寬度
#define ImageHeight 240    //影像處理之高度
int rgb[3][ImageHeight*ImageWidth][256]={0};
//-------------------------------------------------------------------
void showRGBHistogram(TImage *image, TCanvas *canvas)
  Byte * ptr;
  int r, g, b,index;      image->Picture->Bitmap->PixelFormat = pf24bit;
  for (int row=1; row<=ImageHeight; row  )
     { ptr = (Byte*) image->Picture->Bitmap->ScanLine[row];
       index = 0;
       for (int col=0; col     
        
m58610
初階會員


發表:22
回覆:83
積分:36
註冊:2003-09-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-15 00:46:48 IP:203.70.xxx.xxx 未訂閱
row*col好像有點怪 那是否代表如果(5,8)與(8,5)兩點的值相同 就會加到同一個cell中
richtop
資深會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-15 10:19:14 IP:211.76.xxx.xxx 未訂閱
dragonhippopdc 您好:    
引言: 我發現我貼的code有點寫錯~我現在修正了一下但是還是有問題 各位大大~假設我一段320*240的影像~而我想對每一個frame的每一個pixel的rgb的值做累加請問我貼的這段code那裡出了問題呢~為什麼我一執行電腦的記憶體就被吃光然後死當了~
//-------------------------------------------------------------------
#include 
#include
#pragma hdrstop
#include "Unit1.h"
//-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define ImageWidth 320     //影像處理之寬度
#define ImageHeight 240    //影像處理之高度
int rgb[3][ImageHeight*ImageWidth][256]={0}; //此處用了為數可觀的記憶體
//-------------------------------------------------------------------
void showRGBHistogram(TImage *image, TCanvas *canvas)
  Byte * ptr;
  int r, g, b,index;      image->Picture->Bitmap->PixelFormat = pf24bit;
  for (int row=1; row<=ImageHeight; row  )
     { ptr = (Byte*) image->Picture->Bitmap->ScanLine[row];
       index = 0;
       for (int col=0; col
誠如 m58610 所提到的,在位置的指定上可以修改如上。 可以試著用下列方式來降低陣列的大小: 1.如果可以先將影像轉為灰階,則可以省下三分之二的陣列記憶體。 2.如果frame的數目小於256,則可試著將int改為unsigned char。 3.萬一您要的是彩色的影像處理,且該段影片不是即時的,則可以試著將影像分成若干塊,再依序對其中的每一塊做統計,統計的結果先存在檔案中,最後再連結在一起。 以上建議,供您參考,試試看是否適用於您的問題。 RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-15 17:30:49 IP:218.175.xxx.xxx 未訂閱
RichTop你好~ 因為我是要應用在彩色的~而我是要用於ccd上所拍攝即時的道路影像~然後用timer一秒到ccd抓一個frame來做差異比較~差異度太大就設成0差異度小就累計rgb值~經過一段時間累加後~再到統計圖抓最大的值~藉由如此來建立背景 請問你覺得我應該怎麼做會比較好呢~
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-02-15 18:33:28 IP:218.175.xxx.xxx 未訂閱
我改成了richtop大大所說的如此但是一compiler卻發生如我貼的圖的錯誤訊息~請問為何會這樣呢~?
//---------------------------------------------------------------------------    #include 
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define ImageWidth 320     //影像處理之寬度
#define ImageHeight 240    //影像處理之高度
unsigned char rgb[3][ImageHeight*ImageWidth][256]={0};
//-------------------------------------------------------------------
void showRGBHistogram(TImage *image, TCanvas *canvas)
{ Byte * ptr;
  int r, g, b,index;      image->Picture->Bitmap->PixelFormat = pf24bit;
  for (int row=0; rowPicture->Bitmap->ScanLine[row];
       index = 0;
       for (int col=0; colPen->Color = colors[p];
        canvas->MoveTo(0,(rgb[p][col][0]));
        for (int x=1; x<256; x++)
          {
           canvas->LineTo(x, (int)(rgb[p][col][x]));
          }
        }
     } */
}    //-------------------------------------------------------------------
 
richtop
資深會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-02-15 21:35:05 IP:211.76.xxx.xxx 未訂閱
dragonhippopdc 您好: 感覺好像是記憶體消耗太多了! 關於找背景,應該不只這種方法才對,您可以嘗試別的方式,否則照這樣需要很大的記憶體容量,程式編譯與連結甚至執行都可能會出現問題的。 RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-02-15 22:47:48 IP:218.175.xxx.xxx 未訂閱
嗯~應該是記憶體耗太多了~ 只好再找找其它方法了~ 如果各位大大對這方面有所了解的~能給我一些意見
m58610
初階會員


發表:22
回覆:83
積分:36
註冊:2003-09-07

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-02-16 01:13:54 IP:203.67.xxx.xxx 未訂閱
int rgb[3][ImageHeight*ImageWidth][256]={0}; 試試看不要一開始宣告時就給{0} 用三個for在程式裡給0 有可能就好了 另外也可以把宣告成int ***rgb; 之後再用動態矩陣方式給其矩陣大小
richtop
資深會員


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-02-16 09:40:36 IP:211.76.xxx.xxx 未訂閱
dragonhippopdc 您好:    今早突然想到可以用宣告動態記憶體方式來取得大的記憶體區塊。試了一下,可以!剛好 m58610 大大也提到了。 底下是簡單測試碼請參考。如果要弄成三維的亦可,不過會比較複雜。 建議是採用一維的陣列,不過存放資料的順序就要您自己來決定了。 我個人的建議是:除非此法為唯一且必須,否則還是用相對少耗用資源的方式,減少出錯並增加成功的機率。 您再試試吧!    
void __fastcall TForm1::Button1Click(TObject *Sender)
{   
   unsigned char *rgb = new unsigned char[3*ImageHeight*ImageWidth*256*40]; // It works!
   
   if ( rgb==NULL )
     ShowMessage("Memory allocation error!");
   else
     ShowMessage("Memory allocation success!");       if ( rgb!=NULL )
    delete [] rgb;
}
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-02-16 14:58:43 IP:218.175.xxx.xxx 未訂閱
我想到說是不是用鍊結串列來做會不會比較好一點~ 想請問你們這樣是不是可行呢~
系統時間:2024-05-17 12:21:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!