307 lines
12 KiB
C++
307 lines
12 KiB
C++
|
|
// main.cpp
|
|||
|
|
|
|||
|
|
/* @brief<65><66><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IKapC<70><43><EFBFBD><EFBFBD>IKapBoard<72>⣬ͨ<E2A3AC><CDA8><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
|
|||
|
|
*
|
|||
|
|
* @brief<EFBFBD><EFBFBD>This example shows users how to use IKapC and IKapBoard libraries to
|
|||
|
|
* grab images continuously with grabber linked camera. */
|
|||
|
|
|
|||
|
|
#include <malloc.h>
|
|||
|
|
#include <shlwapi.h>
|
|||
|
|
#include <stdio.h>
|
|||
|
|
#include <stdlib.h>
|
|||
|
|
#include <tchar.h>
|
|||
|
|
|
|||
|
|
#include "../GeneralConfigureCamera/ConfigureCamera.h"
|
|||
|
|
#include "GeneralGrabWithGrabber.h"
|
|||
|
|
|
|||
|
|
#pragma comment(lib, "IKapBoard.lib")
|
|||
|
|
#pragma comment(lib, "IKapC.lib")
|
|||
|
|
#pragma comment(lib, "shlwapi.lib")
|
|||
|
|
|
|||
|
|
/* @brief<65><66>ע<EFBFBD><D7A2><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*
|
|||
|
|
* @brief<EFBFBD><EFBFBD>Register callback functions. */
|
|||
|
|
void RegisterCallbackWithGrabber(pItkCamera pCam);
|
|||
|
|
|
|||
|
|
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*
|
|||
|
|
* @brief<EFBFBD><EFBFBD>Unregister callback functions. */
|
|||
|
|
void UnRegisterCallbackWithGrabber(pItkCamera pCam);
|
|||
|
|
|
|||
|
|
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ϊһ<CEAA><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
|
|||
|
|
* @param[in] pContext<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*
|
|||
|
|
* @brief<EFBFBD><EFBFBD>This function is registered as a callback function. When starting
|
|||
|
|
* grabbing images, the function will be called.
|
|||
|
|
* @param[in] pContext<EFBFBD><EFBFBD>Input parameter. */
|
|||
|
|
void CALLBACK OnGrabStart(void* pContext);
|
|||
|
|
|
|||
|
|
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ϊһ<CEAA><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ֡ͼ<D6A1><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
|
|||
|
|
* @param[in] pContext<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*
|
|||
|
|
* @brief<EFBFBD><EFBFBD>This function is registered as a callback function. When a frame of
|
|||
|
|
* image grabbing ready, the function will be called.
|
|||
|
|
* @param[in] pContext<EFBFBD><EFBFBD>Input parameter. */
|
|||
|
|
void CALLBACK OnFrameReady(void* pContext);
|
|||
|
|
|
|||
|
|
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ϊһ<CEAA><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
|
|||
|
|
* @param[in] pContext<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*
|
|||
|
|
* @brief<EFBFBD><EFBFBD>This function is registered as a callback function. When grabbing
|
|||
|
|
* images time out, the function will be called.
|
|||
|
|
* @param[in] pContext<EFBFBD><EFBFBD>Input parameter. */
|
|||
|
|
void CALLBACK OnTimeout(void* pContext);
|
|||
|
|
|
|||
|
|
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ϊһ<CEAA><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD>֡ʱ<D6A1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
|
|||
|
|
* @param[in] pContext<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*
|
|||
|
|
* @brief<EFBFBD><EFBFBD>This function is registered as a callback function. When grabbing
|
|||
|
|
* frame lost, the function will be called.
|
|||
|
|
* @param[in] pContext<EFBFBD><EFBFBD>Input parameter. */
|
|||
|
|
void CALLBACK OnFrameLost(void* pContext);
|
|||
|
|
|
|||
|
|
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ϊһ<CEAA><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD>ֹͣʱ<D6B9><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
|
|||
|
|
* @param[in] pContext<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*
|
|||
|
|
* @brief<EFBFBD><EFBFBD>This function is registered as a callback function. When stopping
|
|||
|
|
* grabbing images, the function will be called.
|
|||
|
|
* @param[in] pContext<EFBFBD><EFBFBD>Input parameter. */
|
|||
|
|
void CALLBACK OnGrabStop(void* pContext);
|
|||
|
|
|
|||
|
|
int main()
|
|||
|
|
{
|
|||
|
|
/// \~chinese IKapC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ \~english Return value of IKapC functions
|
|||
|
|
ITKSTATUS res = ITKSTATUS_OK;
|
|||
|
|
|
|||
|
|
/// \~chinese IKapBoard <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ \~english Return value of IKapBoard functions
|
|||
|
|
int ret = IK_RTN_OK;
|
|||
|
|
|
|||
|
|
/// \~chinese <20><>ʼ<EFBFBD><CABC> IKapC <20><><EFBFBD>л<EFBFBD><D0BB><EFBFBD> \~english Initialize IKapC runtime environment
|
|||
|
|
res = ItkManInitialize();
|
|||
|
|
CHECK_IKAPC(res);
|
|||
|
|
|
|||
|
|
ItkCamera cam;
|
|||
|
|
|
|||
|
|
cam.g_bufferCount = 10;
|
|||
|
|
|
|||
|
|
sprintf_s(cam.g_saveFileName, "D:\\CImage.tif");
|
|||
|
|
|
|||
|
|
cam.g_SerialNumber = NULL;
|
|||
|
|
|
|||
|
|
cam.g_bSoftTriggerUsed = 1;
|
|||
|
|
|
|||
|
|
cam.g_bLoadGrabberConfig = 1;
|
|||
|
|
|
|||
|
|
uint32_t numDevices = 0;
|
|||
|
|
res = ItkManGetDeviceCount(&numDevices);
|
|||
|
|
CHECK(res);
|
|||
|
|
|
|||
|
|
// <20><>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5>豸ʱ<E8B1B8><CAB1>
|
|||
|
|
//
|
|||
|
|
// When there is no connected devices.
|
|||
|
|
if (numDevices == 0) {
|
|||
|
|
fprintf(stderr, "No device.\n");
|
|||
|
|
ItkManTerminate();
|
|||
|
|
pressEnterToExit();
|
|||
|
|
exit(EXIT_FAILURE);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
printCameraInfo(numDevices);
|
|||
|
|
|
|||
|
|
/// \~chinese <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸 \~english Open camera with 0 index and configure camera device
|
|||
|
|
int tmpIndex = -1;
|
|||
|
|
fprintf(stderr, "total device count: %d, the index of which you want to open is:", numDevices);
|
|||
|
|
fflush(stderr);
|
|||
|
|
int scanTmp = scanf_s("%u", &tmpIndex);
|
|||
|
|
if (scanTmp != 1) {
|
|||
|
|
fprintf(stderr, "Invalid input. Expect an integer.\n");
|
|||
|
|
ItkManTerminate();
|
|||
|
|
pressEnterToExit();
|
|||
|
|
exit(EXIT_FAILURE);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (tmpIndex >= numDevices)
|
|||
|
|
{
|
|||
|
|
fprintf(stderr, "index: %d is more than %d.\n", tmpIndex, numDevices - 1);
|
|||
|
|
ItkManTerminate();
|
|||
|
|
pressEnterToExit();
|
|||
|
|
exit(EXIT_FAILURE);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
{ int getCharTmp = getchar(); }
|
|||
|
|
|
|||
|
|
ConfigureCamera(&cam, tmpIndex);
|
|||
|
|
|
|||
|
|
if (cam.g_hBoard == INVALID_HANDLE_VALUE) {
|
|||
|
|
fprintf(stderr,"Please select camera with grabber.\n");
|
|||
|
|
ItkManTerminate();
|
|||
|
|
pressEnterToExit();
|
|||
|
|
exit(EXIT_FAILURE);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// \~chinese <20><><EFBFBD>òɼ<C3B2><C9BC><EFBFBD><EFBFBD>豸 \~english Configure frame grabber device
|
|||
|
|
ConfigureFrameGrabber(&cam);
|
|||
|
|
|
|||
|
|
/// \~chinese ע<><D7A2><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD> \~english Register callback functions.
|
|||
|
|
RegisterCallbackWithGrabber(&cam);
|
|||
|
|
|
|||
|
|
/// \~chinese <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ \~english Configure trigger method of the camera
|
|||
|
|
SetSoftTriggerWithGrabber(&cam);
|
|||
|
|
|
|||
|
|
/// \~chinese <20><>ʼͼ<CABC><CDBC><EFBFBD>ɼ<EFBFBD> \~english Start grabbing images
|
|||
|
|
StartGrabImage(&cam);
|
|||
|
|
|
|||
|
|
if (cam.g_bSoftTriggerUsed) {
|
|||
|
|
printf("Please intput t to softTrigger a frame and input e to exit: ");
|
|||
|
|
while (true) {
|
|||
|
|
char T = 0;
|
|||
|
|
int scanTmp = scanf_s("%c", &T, (unsigned)sizeof(T));
|
|||
|
|
if (T == 't') {
|
|||
|
|
if (strcmp(cam.g_devInfo.DeviceClass, "CoaXPress") == 0 ||
|
|||
|
|
strcmp(cam.g_devInfo.DeviceClass, "CameraLink") == 0) {
|
|||
|
|
ret = IKapSetInfo(cam.g_hBoard, IKP_SOFTWARE_TRIGGER_START, 1);
|
|||
|
|
} else {
|
|||
|
|
res = ItkDevExecuteCommand(cam.g_hCamera, "TriggerSoftware");
|
|||
|
|
}
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
} else if (T == 'e') {
|
|||
|
|
break;
|
|||
|
|
} else if (T != '\n') {
|
|||
|
|
printf("Please intput t to softTrigger a frame and input e to exit: ");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// \~chinese <20>ȴ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> \~english Wait for grabbing images finished
|
|||
|
|
{ int getCharTmp = getchar(); }
|
|||
|
|
|
|||
|
|
/// \~chinese ֹͣͼ<D6B9><CDBC><EFBFBD>ɼ<EFBFBD> \~english Stop grabbing images
|
|||
|
|
ret = IKapStopGrab(cam.g_hBoard);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
|
|||
|
|
/// \~chinese <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD> \~english Unregister callback functions
|
|||
|
|
UnRegisterCallbackWithGrabber(&cam);
|
|||
|
|
|
|||
|
|
/// \~chinese <20>رղɼ<D5B2><C9BC><EFBFBD><EFBFBD>豸 \~english Close frame grabber device
|
|||
|
|
ret = IKapClose(cam.g_hBoard);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
|
|||
|
|
/// \~chinese <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸 \~english Close camera device
|
|||
|
|
res = ItkDevClose(cam.g_hCamera);
|
|||
|
|
CHECK_IKAPC(res);
|
|||
|
|
|
|||
|
|
/// \~chinese <20>ͷ<EFBFBD><CDB7>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Buffer<65><72>ַ<EFBFBD><D6B7><EFBFBD>ڴ<EFBFBD> \~english Release the memory that the user requests for setting the Buffer address
|
|||
|
|
/*if (cam.g_user_buffer!=NULL)
|
|||
|
|
free(cam.g_user_buffer);*/
|
|||
|
|
|
|||
|
|
/// \~chinese <20>ͷ<EFBFBD> IKapC <20><><EFBFBD>л<EFBFBD><D0BB><EFBFBD> \~english Release IKapC runtime environment
|
|||
|
|
ItkManTerminate();
|
|||
|
|
|
|||
|
|
pressEnterToExit();
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// \~chinese ע<><D7A2><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD> \~english Register callback functions
|
|||
|
|
/// \~chinese ע<><D7A2><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʹ<EFBFBD><CAB9>static<69><63><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ó<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3>ڸó<DAB8>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ǰ<EFBFBD><C7B0>ʹ<EFBFBD><CAB9> IKapUnRegisterCallback() ȡ<><C8A1>ע<EFBFBD><D7A2><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ͷŵ<CDB7><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣
|
|||
|
|
/// \~english Use a static function declared with 'static' to register a callback, if using a member function, be aware of the lifetime of the object that owns the member function and unregister the callback by IKapUnRegisterCallback() before the object is destroyed, or if the callback is triggered after the object has been released, it will cause an exception
|
|||
|
|
void RegisterCallbackWithGrabber(pItkCamera pCam)
|
|||
|
|
{
|
|||
|
|
int ret = IK_RTN_OK;
|
|||
|
|
|
|||
|
|
ret = IKapRegisterCallback(pCam->g_hBoard, IKEvent_GrabStart, OnGrabStart, pCam);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
/// \~chinese ֡<><D6A1><EFBFBD>ɻص<C9BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>Ӧִ<D3A6>к<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1s/֡<><D6A1> <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>ʧ
|
|||
|
|
/// \~english in OnFrameReady callback function, should not execute time-consuming operation, and finish in time of 1s/framerate, or could cause framelost
|
|||
|
|
ret = IKapRegisterCallback(pCam->g_hBoard, IKEvent_FrameReady, OnFrameReady, pCam);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
ret = IKapRegisterCallback(pCam->g_hBoard, IKEvent_FrameLost, OnFrameLost, pCam);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
ret = IKapRegisterCallback(pCam->g_hBoard, IKEvent_TimeOut, OnTimeout, pCam);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
ret = IKapRegisterCallback(pCam->g_hBoard, IKEvent_GrabStop, OnGrabStop, pCam);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void UnRegisterCallbackWithGrabber(pItkCamera pCam)
|
|||
|
|
{
|
|||
|
|
int ret = IK_RTN_OK;
|
|||
|
|
|
|||
|
|
ret = IKapUnRegisterCallback(pCam->g_hBoard, IKEvent_GrabStart);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
|
|||
|
|
ret = IKapUnRegisterCallback(pCam->g_hBoard, IKEvent_FrameReady);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
|
|||
|
|
ret = IKapUnRegisterCallback(pCam->g_hBoard, IKEvent_FrameLost);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
|
|||
|
|
ret = IKapUnRegisterCallback(pCam->g_hBoard, IKEvent_TimeOut);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
|
|||
|
|
ret = IKapUnRegisterCallback(pCam->g_hBoard, IKEvent_GrabStop);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CALLBACK OnGrabStart(void* pContext)
|
|||
|
|
{
|
|||
|
|
printf("Start grabbing image.\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CALLBACK OnFrameReady(void* pContext)
|
|||
|
|
{
|
|||
|
|
ITKSTATUS res = ITKSTATUS_OK;
|
|||
|
|
|
|||
|
|
int ret = IK_RTN_OK;
|
|||
|
|
|
|||
|
|
pItkCamera cam = (pItkCamera)pContext;
|
|||
|
|
printf("Grab frame ready of camera with serialNumber:%s.\n", cam->g_devInfo.SerialNumber);
|
|||
|
|
unsigned char* pUserBuffer = NULL;
|
|||
|
|
int64_t nFrameSize = 0;
|
|||
|
|
int nFrameCount = 0;
|
|||
|
|
int nFrameIndex = 0;
|
|||
|
|
IKAPBUFFERSTATUS status;
|
|||
|
|
|
|||
|
|
ret = IKapGetInfo(cam->g_hBoard, IKP_FRAME_COUNT, &nFrameCount);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
|
|||
|
|
ret = IKapGetInfo(cam->g_hBoard, IKP_CURRENT_BUFFER_INDEX, &nFrameIndex);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
|
|||
|
|
ret = IKapGetBufferStatus(cam->g_hBoard, nFrameIndex, &status);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
|
|||
|
|
/// \~chinese <20><>ͼ<EFBFBD><EFBFBD><F1BBBAB3><EFBFBD><EFBFBD><EFBFBD>ʱ \~english When the buffer is full
|
|||
|
|
if (status.uFull == 1) {
|
|||
|
|
/// \~chinese <20><>ȡһ֡ͼ<D6A1><CDBC><EFBFBD>Ĵ<EFBFBD>С \~english Get the size of a frame of image
|
|||
|
|
ret = IKapGetInfo64(cam->g_hBoard, IKP_FRAME_SIZE, &nFrameSize);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
|
|||
|
|
/// \~chinese <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MultiExposureTimeCount<6E><74><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>Ҳɼ<D2B2><C9BC><EFBFBD><EFBFBD><EFBFBD>IKP_MULTIPLE_LIGHT_COUNT<4E><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>MultiExposureTimeCount<6E><74>ͬ<EFBFBD><CDAC>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><CBB6><EFBFBD><EFBFBD>ع<D8B9>ܣ<EFBFBD><DCA3>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪN<CEAA><4E><EFBFBD>ع<EFBFBD>ʱ<EFBFBD>䣬[0~1*Height/N-1]<5D>ж<EFBFBD>ӦExposureSelectΪ1ʱ<31><CAB1>ExposureTime<6D><65>[1*Height/N~2*Height/N-1]<5D>ж<EFBFBD>ӦExposureSelectΪ2ʱ<32><CAB1>ExposureTime<6D><65>...<2E><>[(N-1)*Height/N~Height-1]<5D>ж<EFBFBD>ӦExposureSelectΪNʱ<4E><CAB1>ExposureTime. \~english If the MultiExposureTimeCount feature value is greater than 1, the multiple exposure function is turned on, The collected images were all divided into N exposure times, line [0~1 * Height / N-1] corresponds to the ExposureTime at a ExposureSelect of 1, line [1 * Height / N~2 * Height / N-1] corresponds to ExposureTime at ExposureSelect 2,..., line [(N-1) * Height / N~Height-1] corresponds to ExposureTime at ExposureSelect N.
|
|||
|
|
/// \~chinese <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ \~english Get the buffer address
|
|||
|
|
ret = IKapGetBufferAddress(cam->g_hBoard, nFrameIndex, (void**)&pUserBuffer);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
|
|||
|
|
/// \~chinese <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC> \~english Save image
|
|||
|
|
/*
|
|||
|
|
ret=IKapSaveBuffer(cam->g_hBoard,nFrameIndex,cam->g_saveFileName,IKP_DEFAULT_COMPRESSION);
|
|||
|
|
CHECK_IKAPBOARD(ret);
|
|||
|
|
|
|||
|
|
*/
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CALLBACK OnTimeout(void* pContext)
|
|||
|
|
{
|
|||
|
|
printf("Grab image timeout.\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CALLBACK OnFrameLost(void* pContext)
|
|||
|
|
{
|
|||
|
|
printf("Grab frame lost.\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CALLBACK OnGrabStop(void* pContext)
|
|||
|
|
{
|
|||
|
|
printf("Stop grabbing image.\n");
|
|||
|
|
}
|