📄 testgetiplimage.cpp
字号:
// test frame forwarding and getting the frame as an IplImage
#define USE_OPENCVINTERFACE
#include <stdio.h>
#include <windows.h>
#include <memory.h>
#include "MVLib.h"
#include "maviscomm.h"
void writeBmp(BYTE * frameBuf, FrameSize_t fs, const char * filename);
int main(int argc, char** argv)
{
FrameSize_t fs;
HINSTANCE mavisLib = NULL;
GETFRAMESIZEPROC procGetFrameSize = NULL;
GETFRAMEPROC procGetFrame = NULL;
mavisLib = LoadLibrary("mavisclient");
if(!mavisLib)
{
fprintf(stderr, "Can't load mavisclient.dll");
return -1;
}
procGetFrameSize = (GETFRAMESIZEPROC)GetProcAddress(mavisLib, GETFRAMESIZEPROC_NAME);
procGetFrame = (GETFRAMEPROC)GetProcAddress(mavisLib, GETFRAMEPROC_NAME);
procGetFrameSize(&fs);
printf("h = %d, w = %d, bufSize = %d, nPixels = %d\n", fs.height, fs.width, fs.nBufSize, fs.nPixels);
BYTE * buf = new BYTE[fs.nBufSize];
if( procGetFrame(buf, fs.nBufSize) )
printf("failed to get frame data\n");
else
writeBmp(buf, fs, "myfile.bmp");
//int count = 0;
//for(int i=0; i<fs.nBufSize; i++) if(buf[i]) ++count;
//printf("count = %d\n", count);
///////////////////// now get the frame as an IplImage ////////////
GETIPLIMAGESIZEPROC procGetIplImageSize = NULL;
GETIPLIMAGEDATAPROC procGetIplImageData = NULL;
procGetIplImageSize = (GETIPLIMAGESIZEPROC)GetProcAddress(mavisLib, GETIPLIMAGESIZEPROC_NAME);
procGetIplImageData = (GETIPLIMAGEDATAPROC)GetProcAddress(mavisLib, GETIPLIMAGEDATAPROC_NAME);
if( !procGetIplImageData || !procGetIplImageSize )
{
printf("Failed to get address for %s()\n",
(!procGetIplImageSize)? GETIPLIMAGESIZEPROC_NAME :
GETIPLIMAGEDATAPROC_NAME);
}
else
{
CvSize size = procGetIplImageSize();
IplImage * pImg = cvCreateImage(size, IPL_DEPTH_8U, 3);
procGetIplImageData(pImg);
cvSaveImage("test.jpg", pImg);
cout << "pImg->width = " << pImg->width << endl;
cout << "pImg->height = " << pImg->height << endl;
cout << "pImg->widthStep = " << pImg->widthStep << endl;
cout << "pImg->nChannels = " << pImg->nChannels << endl;
cout << "pImg->depth = " << pImg->depth << endl;
cout << "pImg->origin = " << pImg->origin << endl;
cout << "pImg->dataOrder = " << pImg->dataOrder << endl;
cout << "pImg->imageData = " << (int)pImg->imageData << endl;
cvReleaseImage( &pImg );
}
///////// clean up //////////
if(mavisLib) FreeLibrary(mavisLib);
delete[] buf;
return 0;
}
void writeBmp(BYTE * frameBuf, FrameSize_t fs, const char * filename)
{
// Create the bitmap file
HANDLE hf = CreateFile(
filename,
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
NULL,
NULL
);
if( INVALID_HANDLE_VALUE == hf )
{
int err = GetLastError();
printf("Can\'t create file %s: %s", filename, strerror(err));
return;
}
// Write out the bitmap file header
BITMAPFILEHEADER bfh;
memset( &bfh, 0, sizeof( bfh ) );
bfh.bfType = 'MB';
bfh.bfSize = sizeof( bfh ) + fs.nBufSize + sizeof( BITMAPINFOHEADER );
bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER );
DWORD written = 0;
WriteFile( hf, &bfh, sizeof( bfh ), &written, NULL );
// Write the bitmap format information
BITMAPINFOHEADER bih;
memset( &bih, 0, sizeof( bih ) );
bih.biSize = sizeof( bih );
bih.biWidth = fs.width;
bih.biHeight = fs.height;
bih.biPlanes = 1;
bih.biBitCount = 24;
written = 0;
WriteFile( hf, &bih, sizeof( bih ), &written, NULL );
// Write the bitmap bits
written = 0;
WriteFile( hf, frameBuf, fs.nBufSize, &written, NULL );
// release resources
CloseHandle( hf );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -