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

再請教一下關於影像擷取的問題

尚未結案
Silent Knox
一般會員


發表:7
回覆:4
積分:2
註冊:2004-05-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-01 01:06:20 IP:163.13.xxx.xxx 未訂閱
我想再請教一下,利用MIL擷取24bits彩色影像時... 1. 通常各位在做即時影像擷取分析時 比較建議利用MdigGrab()所將數據輸出至變數矩陣中,再對矩陣作處理 或是讀取MbufExport()產生的檔案,再將檔案讀入變數陣列中 還是有其他方法在使用MdigGrabContinue()函式做連續擷取的時候 順便將數據存入所宣告的變數陣列中〈例如使用MemoryStream再複製到變數陣列中,如果可行請教我如何使用〉??? 2. 對於儲存與分析影像資料,各位是否有比較建議使用什麼類型或格式的變數或陣列來裝置所讀入資料呢??? 3. 在BCB中,各位通常用什麼元件來作影像的預覽與處理結果顯示呢??? 〈除了使用TFrom元件之外〉
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-01 01:23:07 IP:140.135.xxx.xxx 未訂閱
您好:
由於小弟沒用過MIL所以1跳過
但是有其他方式您可以參考看看
< href="http://delphi.ktop.com.tw/topic.php?TOPIC_ID=22263">http://delphi.ktop.com.tw/topic.php?TOPIC_ID=22263
【問題】CCD API 函數使用問題!
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27363
【問題】請問如何將CCD拍下的畫面直接存入陣列中呢?    第3點,若想顯示結果的話,常用的就是TImage了
順心 發表人 -
fnk
高階會員


發表:40
回覆:149
積分:102
註冊:2004-01-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-02 01:04:31 IP:140.124.xxx.xxx 未訂閱
不好意思, 就我所知.. Matrox的影像擷取卡, 並不支援VFW的格式, 因此, 只能使用MIL的函式,    所以, 針對第一點, MIL的函式有一個 Hook Function,  可以設定參數, 使得當影像擷取卡擷取到一張完整的畫面時,  就呼叫某一個特定的函式, 這個功能就類似 VFW 的CallBack Function,    第一步,  設定Hook Function, 其中M_GRAB_FRAME_END的參數, 就是設定當影像擷取卡,  擷取到一張完整的畫面時, 就呼叫 FrameOneGrabEnd 這個函式,  
MdigHookFunction(mildig1,M_GRAB_FRAME_END,FrameOneGrabEnd,(void *)(&UserStruct)); 
第二步, 撰寫 FrameOneGrabEnd 函式,
 long MFTYPE FrameOneGrabEnd(long HookType, MIL_ID EventId, void MPTYPE *UserStructPtr) 
  {
  ...
  MbufGet2d(milbuf1,0L,0L,640L,480L,buf1);  // 將擷取到的影像, 放到buf1, 接著就可以對 buf1 做處理
  ...
  ...
  MbufPut2d(milbuf1,0L,0L,640L,480L,buf1);  // 將處理的結果顯示出來
  ...
  }
第三步, 在程式結束之前, 要將Hook Function取消
 MdigHookFunction(mildig1, M_GRAB_FRAME_END M_UNHOOK, FrameOneGrabEnd, (void *)(&UserStruct));
P.S. buf1的設定
unsigned char buf1[480][640]; 
Good Luck !! 發表人 - fnk 於 2004/06/02 01:08:42
m58610
初階會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-03 03:07:37 IP:211.76.xxx.xxx 未訂閱
1.因為BCB可以直接對BMP檔案做編輯...所以我本身是用MbufExport()來抓圖...MdigGrabContinue()不是只能讓影像一直跑嗎??那變數應該不好抓吧... 2.儲存當然用BMP對BCB方便多...用BMP檔做影像分析基本上用SCANLINE就滿方便的... 3.連續影像好像只能在FORM上使用...所以預覽都在表單左上角...處理結果因為我用BMP所以就用IMAGE元件就可以了...
fnk
高階會員


發表:40
回覆:149
積分:102
註冊:2004-01-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-06 07:12:29 IP:140.124.xxx.xxx 未訂閱
當你使用Hook Function時(用MdigHookFunction來設定), 並且配合MdigGrabContinue(), 則...影像擷取卡會在每次抓完一張影像之後.. 會"自動地"呼叫你的Hook Function, 此時, 你只要配合MbufGet2d這個函式, 就可以將擷取到的影像存入你的Buffer, 如此可以方便後續的影像處理的動作, 因為,其影像擷取只關係到記憶體的存取, 因此,較能達成"即時"的要求。 m58610 大大所建議的方向, 我想是很不錯的, 但是若是在"即時性"的考量上, 將影像先存成Bmp,再進行處理, 因為會涉及到硬碟的存取, 在速度上,會比存取Buffer要慢很多, 所以, 若"即時性"是很重要的考量的話, 建議可以採用Hook Function的方式來達成, 但, 若只是要影像處理, 無所謂即不即時, 我想採用m58610 大大所建議的方向, 是很不錯的!! Good Luck !! 發表人 - fnk 於 2004/06/06 07:18:44
m58610
初階會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-06 23:37:37 IP:211.76.xxx.xxx 未訂閱
HOOP FUNCTION....我沒啥研究.... 是不是MIL Lite中是沒有這些函數... 我有看到很多內建的函數... 包括計算面積..等等...不過Lite都沒有... 那時我也是需要即時性... 但是實在沒看到這些東西... 不然我的專題可能會更好...
fnk
高階會員


發表:40
回覆:149
積分:102
註冊:2004-01-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-06-07 01:46:17 IP:140.124.xxx.xxx 未訂閱
嗯...有的.. 在MIL-Lite中有支援Hook Function.. 我所使用的是MIL-Lite 6.1版的...
Silent Knox
一般會員


發表:7
回覆:4
積分:2
註冊:2004-05-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-06-07 19:53:12 IP:163.13.xxx.xxx 未訂閱
感謝各位的指導,小弟這幾天在做試程式所以晚了幾天回覆 還有幾個問題,麻煩各位解答    1. 在Hook Function中最後一個參數(void *)(&UserStruct)    小弟參考過MIL On-Line Help與其範例程式,只是了解有限    請問該結構的功能與用途為何???    2. 小弟想利用一個class來負責作影像擷取卡的驅動與影像擷取的功能    執行時遇到一些錯誤訊息,還麻煩各位再次指導    撰寫的程式片段如下...    Image_Grab.h --------------------------------------------------------------- //--------------------------------------------------------------------------- #ifndef Image_GrabH #define Image_GrabH //--------------------------------------------------------------------------- #include "Mil.h" //--------------------------------------------------------------------------- class TImage_Capture { private:        // User declarations         MIL_ID MilApplication, MilSystem, MilDisplay, MilDigitizer, MilImage;            int BufferSelect;            struct UserDataStruct         {                 MIL_ID  *MilImage;                 MIL_ID  MilDigitizer;                 MIL_ID  GrabEndEvent;                 long    NbGrabStart;                 long    NbGrabEnd;                 double  Time;         };            UserDataStruct UserStruct;    public:         // User declarations         TImage_Capture(void);         ~TImage_Capture(void);         //------------------         unsigned char *ImageData;         //------------------         void CaptureImageData(unsigned char *pImage);         long MFTYPE FrameOneGrabEnd(long HookType, MIL_ID EventId, void MPTYPE *UserStructPtr);         //------------------ }; //--------------------------------------------------------------------------- extern PACKAGE TImage_Capture *Capture; //--------------------------------------------------------------------------- #endif ---------------------------------------------------------------        Image_Grab.cpp --------------------------------------------------------------- //--------------------------------------------------------------------------- #include  #pragma hdrstop #include "Image_Grab.h" //--------------------------------------------------------------------------- #pragma package(smart_init) TImage_Capture *Capture=new TImage_Capture(); //--------------------------------------------------------------------------- TImage_Capture::TImage_Capture(void) { MappAlloc(M_SETUP, &MilApplication); //配置各應用程式 MsysAlloc(M_SYSTEM_METEOR_II, M_DEFAULT, M_DEFAULT, &MilSystem); //設定影像擷取卡 MdigAlloc(MilSystem, M_DEFAULT, "M_NTSC", M_DEFAULT, &MilDigitizer); //設定CCD Camera,彩色CCD則為"M_NTSC" MdispAlloc(MilSystem, M_DEFAULT, "M_DEFAULT", M_DEFAULT, &MilDisplay); //配置顯示器 MbufAllocColor(MilSystem, 3, 640, 480, 8 M_UNSIGNED, M_IMAGE M_DISP M_GRAB M_PROC, &MilImage); //設定影像BUFFER,尺寸為640×480,8 M_UNSIGNED是8bits無號數彩色BUFFER MdigGrabContinuous(MilDigitizer, MilImage); //擷取連續的影像 MdigHookFunction(MilDigitizer, M_GRAB_FRAME_END, FrameOneGrabEnd, (void *)(&UserStruct)); ImageData = new unsigned char[3*640*480]; } //--------------------------------------------------------------------------- TImage_Capture::~TImage_Capture(void) { MdigHookFunction(MilDigitizer, M_GRAB_FRAME_END M_UNHOOK, FrameOneGrabEnd, (void *)(&UserStruct)); MdigHalt(MilDigitizer); //釋放CCD Camera MbufFree(MilImage); //釋放緩衝區 MdispFree(MilDisplay); //釋放顯示器 MdigFree(MilDigitizer); //釋放數位裝置 MsysFree(MilSystem); //釋放系統 MappFree(MilApplication); //釋放應用程式 } //--------------------------------------------------------------------------- long MFTYPE TImage_Capture::FrameOneGrabEnd(long HookType, MIL_ID EventId, void MPTYPE *UserStructPtr) { MbufGetColor(MilImage, M_RGB24 M_PACKED, M_ALL_BAND, ImageData); return 0; } //--------------------------------------------------------------------------- 錯誤訊息如下 [C Error] Image_Grab.cpp(29): E2034 Cannot convert 'long (__stdcall * (_closure )(long,long,void *))(long,long,void *)' to 'long (__stdcall *)(long,long,void *)' [C Error] Image_Grab.cpp(29): E2342 Type mismatch in parameter 'HandlerPtr' (wanted 'long (__stdcall *)(long,long,void *)', got 'void') [C Error] Image_Grab.cpp(36): E2034 Cannot convert 'long (__stdcall * (_closure )(long,long,void *))(long,long,void *)' to 'long (__stdcall *)(long,long,void *)' [C Error] Image_Grab.cpp(36): E2342 Type mismatch in parameter 'HandlerPtr' (wanted 'long (__stdcall *)(long,long,void *)', got 'void') [C Error] Image_Grab.cpp(48): E2092 Storage class 'extern' is not allowed here
m58610
初階會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-06-08 17:44:48 IP:211.74.xxx.xxx 未訂閱
引言: 嗯...有的.. 在MIL-Lite中有支援Hook Function.. 我所使用的是MIL-Lite 6.1版的...
不知是不是MIL lite 3.0沒有吧.... 哈哈....
fnk
高階會員


發表:40
回覆:149
積分:102
註冊:2004-01-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-06-11 07:50:16 IP:140.124.xxx.xxx 未訂閱
我不太知道你的問題到底出在那裡.. 但有幾個建議給你... [1] 可以的話, 先利用最簡單的情況去測試, 先不要使用到Class的方式 [2] 通常 GrabContinuous 是在..Hook Function 準備好的情況下去呼叫的    以下,我附上我的程式,給你參考, 若有問題, 再一起研究,    [visual.h]  
 
#include "mil.h"    /* Hook data structure. */
typedef volatile struct
   {
   MIL_ID  *MilImage; 
   MIL_ID  MilDigitizer;  
   MIL_ID  GrabEndEvent;
   long    NbGrabStart;
   long    NbGrabEnd;
   double  Time;
   } UserDataStruct;    void Initial_MIL(void);
void Free_MIL(void);
long MFTYPE FrameOneGrabEnd(long HookType, MIL_ID EventId, void MPTYPE *UserStructPtr);
[visual.c]
 
#include "visual.h"    MIL_ID milapp,milsys1,mildisp1,mildig1,milbuf1,milgra1;    unsigned char buf1[480][640];
UserDataStruct UserStruct;    void Initial_MIL(void)
  {
  long BufSizeX1,BufSizeY1;
    
  /* Allocate a MIL application. */
  MappAlloc(M_DEFAULT,&milapp);
  
  /* Allocate a MIL system. */
  MsysAlloc(M_SYSTEM_METEOR_II,M_DEV0,M_DEFAULT,&milsys1);      /* Allocate a MIL display. */
  MdispAlloc(milsys1, M_DEFAULT, M_DEF_DISPLAY_FORMAT, M_DEFAULT, &mildisp1);
  
  /* Allocate a MIL digitizer if supported and sets the target image size. */
  MdigAlloc(milsys1, M_DEFAULT, M_DEF_DIGITIZER_FORMAT, M_DEFAULT, &mildig1);
  MdigInquire(mildig1, M_SIZE_X,  &BufSizeX1);
  MdigInquire(mildig1, M_SIZE_Y,  &BufSizeY1);
  
  /* Allocate a MIL buffer. */
  MbufAlloc2d(milsys1,BufSizeX1,BufSizeY1,8 M_UNSIGNED,M_IMAGE M_DISP M_GRAB M_PROC,&milbuf1); 
  
  /* Clear the buffer */
  MbufClear(milbuf1,0); 
  MdispSelect(mildisp1,milbuf1);
  MgraAlloc(milsys1,&milgra1);
      
  /* Hook function */
  MdigHookFunction(mildig1,M_GRAB_FRAME_END,FrameOneGrabEnd,(void *)(&UserStruct));      MdigGrabContinuous(mildig1, milbuf1);
  }    void Free_MIL(void)
  {
  MdigHookFunction(mildig1, M_GRAB_FRAME_END M_UNHOOK, FrameOneGrabEnd, (void *)(&UserStruct));
  MdigHalt(mildig1);
  MdigGrabWait(mildig1, M_GRAB_END);
  MgraFree(milgra1);
  MbufFree(milbuf1);
  MdispFree(mildisp1);
  MdigFree(mildig1);
  MsysFree(milsys1);
  
  MappFree(milapp);
  }    long MFTYPE FrameOneGrabEnd(long HookType, MIL_ID EventId, void MPTYPE *UserStructPtr)
  {
  MbufGet2d(milbuf1,0L,0L,640L,480L,buf1);  /* but original image into buffer */
  
  return(0);
  }
發表人 - fnk 於 2004/06/11 07:56:21
Silent Knox
一般會員


發表:7
回覆:4
積分:2
註冊:2004-05-26

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-06-14 11:28:27 IP:163.13.xxx.xxx 未訂閱
小弟思考有點混亂了,先跟各位說聲抱歉   先謝謝
系統時間:2024-05-07 7:50:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!