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

請問如何將影像連續show到Image上?

尚未結案
MemoryQ
一般會員


發表:4
回覆:7
積分:2
註冊:2005-10-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-26 20:13:00 IP:163.28.xxx.xxx 未訂閱
大家好 我將網路攝影機拍攝存的連續影像(我是利用taishyang大大的攝影機元件做的)取其中的像素值丟到buffer去做運算...可是我不知道該怎麼把運算後buffer裡的東西show到Image上... 另外...我想請問一下Image2->Picture->Assign(Bmp);這是什麼意思呢 因為我在版上看到...可是不懂它的意思不知道該如何運用... 煩請大家幫幫忙...謝謝
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-27 01:02:48 IP:219.84.xxx.xxx 未訂閱
把buffer的東西用scanline丟進TBitmap,然後用TCanvas的Draw就可以畫出來了。
MemoryQ
一般會員


發表:4
回覆:7
積分:2
註冊:2005-10-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-31 12:40:05 IP:163.28.xxx.xxx 未訂閱
謝謝pwipwi您的答覆..不過你說的"用TCanvas的Draw就可以畫出來"這個我不太了解,我可以把我的程式附上..請您幫我做修改嗎? 以下就是我寫到一半的Code,目前不知道怎麼將buffer3的東西show到Image上    
//-------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"    #include 
#include <math.h>
#include 
#include 
#include     #define col 320
#define row 240    void testttt();
unsigned char  *buffer1;
unsigned char  *buffer2;
unsigned char  *buffer3;    int t;    //-------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "EzCapCamera"
#pragma resource "*.dfm"
TForm1 *Form1;
//-------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//-------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
 EzCapCamera1->CameraDisplay();   //開啟攝影機功能     //開啟動態記憶體
 if(
    !(buffer1 =new unsigned char[row*col 1])||
    !(buffer2 =new unsigned char[row*col 1])||
    !(buffer3 =new unsigned char[row*col 1])
   )
 {
   cout<<"open memory is error";
   getch();
   exit(1);
 }
}
//-------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 //關閉動態記憶體
 delete[] buffer1;
 delete[] buffer2;
 delete[] buffer3;     EzCapCamera1->CameraClose();  //關閉攝影機功能    }
//-------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
EzCapCamera1->CapBmpPic("1.bmp"); //儲存圖檔
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
 Image1->Picture->LoadFromFile("1.bmp"); //載入圖檔
 if (Image1->Picture->Bitmap->Empty==true)
 {
  ShowMessage("請載入圖檔!!");
 }
 Graphics::TBitmap *Bmp = new Graphics::TBitmap();
 Byte *ptr1;
 Byte *ptr2;
 int i,j,time;
 static k=0;     Bmp->Assign(Image1->Picture->Bitmap);     k=time%2;     if(k==0)
 {
  for(j=0;jHeight;j  )
  {
   ptr1 = (Byte *)Bmp1->ScanLine[j];
   for(i=0;iWidth;i  )
   {
    ptr1[i*3]=buffer1[j*col i];
    ptr1[i*3 1]=buffer1[j*col i];
    ptr1[i*3 2]=buffer1[j*col i];
   }
  }
  time  ;
 }     if(k==1)
 {
  for(j=0;jHeight;j  )
  {
   ptr2 = (Byte *)Bmp2->ScanLine[j];
   for(i=0;iWidth;i  )
   {
    ptr2[i*3]=buffer2[j*col i];
    ptr2[i*3 1]=buffer2[j*col i];
    ptr2[i*3 2]=buffer3[j*col i];
   }
  }
  time  ;
 }     for(i=0;i80)
    buffer3[i]=0;
  else
    buffer3[i]=255;
 }    }
//-------------------------------------------------------------------    
發表人 - MemoryQ 於 2005/10/31 21:02:48
taishyang
站務副站長


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-31 19:51:56 IP:210.68.xxx.xxx 未訂閱
MemoryQ您好:    PO程式碼的方式與版規說明請參考下面連結,煩請修改謝謝您的配合 > 程式方面的問題: class="code">Image1->Picture->Assign(Bmp2); 順心
MemoryQ
一般會員


發表:4
回覆:7
積分:2
註冊:2005-10-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-31 20:54:19 IP:163.28.xxx.xxx 未訂閱
謝謝您的回答...PO程式碼的方式我會注意的 可是我現在是要顯示buffer3的東西到Image2上耶 我原先的想法是寫一個計數器, 一張存到Bmp1去一張存到Bmp2去, 然後丟到buffer1和buffer2去做相減, 把結果丟到buffer3去, 不知道我這樣寫是不是有錯呢? 而且我不知要怎麼把buffer3的結果show到Image2上, 另外...因為我不知該怎麼寫能對連續的影像做處理所以才會寫了那個計數器, 請問有辦法寫出抓連續的影像到不同buffer去做運算嗎? 煩請大家幫幫忙了..謝謝
taishyang
站務副站長


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-11-01 09:49:07 IP:210.68.xxx.xxx 未訂閱
您好:    您的程式邏輯上怪怪的 建議您搜尋[影像相減]可以找到相關程式碼供您參考    順心
MemoryQ
一般會員


發表:4
回覆:7
積分:2
註冊:2005-10-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-01 13:16:30 IP:163.28.xxx.xxx 未訂閱
taishyang謝謝您... 我回去把程式稍做了修改..可以請您幫我看看嗎(buffer2的地方我不會寫) 我現在想抓連續的影像一直丟到buffer1和buffer2去 可是不知道怎麼能夠先把第一張丟到buffer1 然後再把第二張丟到buffer1以及把第一張從buffer1丟到buffer2 接下去再把第三張丟到buffer1以及把第二張丟到buffer2 這樣一直下去...其實我有利用搜索功能找影像相減的程式 可是連續丟影像到不同的buffer這個問題我一直無法解決(而且要怎麼讓他在做相減的那個時間buffer1和buffer2的影像是設定在上一張和下一張的呢?) 可以請您幫個忙 指導一下嗎...拜託您了
taishyang
站務副站長


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-01 15:26:18 IP:210.68.xxx.xxx 未訂閱
引言:可以請您幫個忙 指導一下嗎...拜託您了
建議您先畫個流程圖,然後再寫程式 把目標範圍縮小,比如:影像相減的部份可以先確認是否OK 然後再套用在程式的流程當中 [連續丟影像到不同的buffer] 這部份您可以顯示buffer到Image上就知道這步驟是否正確 然而您在程式中宣告了
Graphics::TBitamp* Bmp = new Graphics::TBitmap();
這Bmp就是一個Buffer,不需用再宣告
unsigned char  *buffer1
...等buffer 至於如何取得影像的像素值,就是靠您程式中的ptr來獲得 有問題再提出 順心
MemoryQ
一般會員


發表:4
回覆:7
積分:2
註冊:2005-10-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-11-02 13:24:14 IP:163.28.xxx.xxx 未訂閱
taishyang您好 謝謝您的指教,原來Bmp就是一個Buffer,我參考了以前人的程式,又做了些修改 可是執行的時候出現 [Linker Fatal Error] Fatal: Unable to open file 'C0W32.OBJ' 這一行字,不知道是什麼問題?? 以下..麻煩請您幫我看看好嗎?     
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
 Image1->Picture->LoadFromFile("1.bmp"); //載入圖檔
 if (Image1->Picture->Bitmap->Empty==true)
 {
  ShowMessage("請載入圖檔!!");
 }
 Graphics::TBitmap* Bmp1=new Graphics::TBitmap;
 Graphics::TBitmap* Bmp2=new Graphics::TBitmap;
 Graphics::TBitmap* Bmp3=new Graphics::TBitmap;
 int x,y,b1,b2,g1,g2,r1,r2,Width,Height,gray1,gray2,gray3;
 Byte *ptr1, *ptr2,*ptr3;
 Bmp1=Image1->Picture->Bitmap;
 Bmp2=Image2->Picture->Bitmap;
 Bmp3=Image3->Picture->Bitmap;
 for (y=0; yHeight; y  )
 {
  ptr1=(Byte*)Bmp1->ScanLine[y];
  ptr2=(Byte*)Bmp2->ScanLine[y];
  ptr3=(Byte*)Bmp3->ScanLine[y];
  for (x=0; xWidth; x  )
  {
   b1=ptr1[x*3];
   g1=ptr1[x*3 1];
   r1=ptr1[x*3 2];
   b2=ptr2[x*3];
   g2=ptr2[x*3 1];
   r2=ptr2[x*3 2];
   gray1=(0.299*r1 0.587*g1 0.114*b1);
   gray2=(0.299*r2 0.587*g2 0.114*b2);
   gray3=abs(gray1-gray2);       if(gray3>70)
   {
    ptr3[x*3]=0;
    ptr3[x*3 1]=0;
    ptr3[x*3 2]=0;
   }
   else
   {
    ptr3[x*3]=255;
    ptr3[x*3 1]=255;
    ptr3[x*3 2]=255;
   }
  }
 }
Image3->Picture->Assign(Bmp3);    }
 
還有一個問題是..因為我是參考別人這樣做的 可是我不了解這樣子Bmp1和Bmp2存下來的就會是連續上下兩張的影像嗎? 如何確保不會是同一張的呢? 還是這樣寫並不能達到我需要的結果? 可以請您幫我做個修改嗎? 拜託您了
taishyang
站務副站長


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-11-02 14:23:32 IP:210.68.xxx.xxx 未訂閱
引言:[Linker Fatal Error] Fatal: Unable to open file 'C0W32.OBJ'
此問題可搜尋到解答
引言:還有一個問題是..因為我是參考別人這樣做的 可是我不了解這樣子Bmp1和Bmp2存下來的就會是連續上下兩張的影像嗎? 如何確保不會是同一張的呢? 還是這樣寫並不能達到我需要的結果? 可以請您幫我做個修改嗎? 拜託您了
您這段程式的邏輯表示BMP1與BMP2相減且二值化的結果透過BMP3顯示到Image3上 所以您必須加上一段程式碼,讓前後兩張的影像assign給BMP1與BMP2 (在您的程式中是靠Image1和Image2)
MemoryQ
一般會員


發表:4
回覆:7
積分:2
註冊:2005-10-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-11-02 20:38:48 IP:163.28.xxx.xxx 未訂閱
taishyang您好..謝謝您的回答 那可以請問您"讓前後兩張的影像assign給Bmp1與Bmp2"怎麼寫嗎? 我現在最大的問題在於不知道怎麼讓Bmp1和Bmp2存到的是連續的前後兩張的影像, 可以幫幫忙嗎? 真的很感謝您
taishyang
站務副站長


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-11-02 23:49:51 IP:218.168.xxx.xxx 未訂閱
您好:    請將您寫的程式碼po上來讓前輩們幫您看看問題在哪邊 而不是請別人幫您寫程式碼 下面連結有類似的程式碼,參考看看 < href="http://delphi.ktop.com.tw/topic.php?TOPIC_ID=78538">http://delphi.ktop.com.tw/topic.php?TOPIC_ID=78538 【問題】有關影像相減
系統時間:2024-05-10 22:54:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!