再請教一下關於影像擷取的問題 |
尚未結案
|
Silent Knox
一般會員 發表:7 回覆:4 積分:2 註冊:2004-05-26 發送簡訊給我 |
我想再請教一下,利用MIL擷取24bits彩色影像時...
1. 通常各位在做即時影像擷取分析時
比較建議利用MdigGrab()所將數據輸出至變數矩陣中,再對矩陣作處理
或是讀取MbufExport()產生的檔案,再將檔案讀入變數陣列中
還是有其他方法在使用MdigGrabContinue()函式做連續擷取的時候
順便將數據存入所宣告的變數陣列中〈例如使用MemoryStream再複製到變數陣列中,如果可行請教我如何使用〉??? 2. 對於儲存與分析影像資料,各位是否有比較建議使用什麼類型或格式的變數或陣列來裝置所讀入資料呢??? 3. 在BCB中,各位通常用什麼元件來作影像的預覽與處理結果顯示呢???
〈除了使用TFrom元件之外〉
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
您好:
由於小弟沒用過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 發送簡訊給我 |
不好意思, 就我所知..
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 發送簡訊給我 |
|
fnk
高階會員 發表:40 回覆:149 積分:102 註冊:2004-01-02 發送簡訊給我 |
當你使用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 發送簡訊給我 |
|
fnk
高階會員 發表:40 回覆:149 積分:102 註冊:2004-01-02 發送簡訊給我 |
|
Silent Knox
一般會員 發表:7 回覆:4 積分:2 註冊:2004-05-26 發送簡訊給我 |
感謝各位的指導,小弟這幾天在做試程式所以晚了幾天回覆
還有幾個問題,麻煩各位解答 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
|
m58610
初階會員 發表:22 回覆:83 積分:36 註冊:2003-09-07 發送簡訊給我 |
|
fnk
高階會員 發表:40 回覆:149 積分:102 註冊:2004-01-02 發送簡訊給我 |
我不太知道你的問題到底出在那裡..
但有幾個建議給你...
[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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |