⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testgetiplimage.cpp

📁 机器人程序
💻 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 + -