由于labview可以调用C++的库,所以可以采用将控制部分封装成DLL,然后从Labview调用DLL的导出函数
例如:
C++
*.h
#pragma once
#ifdef CPP_FILE
#define USE_DLL extern"C" __declspec(dllexport)
#else
#define USE_DLL extern"C" __declspec(dllimport)
#endif // CPP_FILE
//USE_DLL int LT_CL_EnumDevice(char* acqServerName);
/// <summary>
/// 初始化采集卡
/// </summary>
/// <param name="ServerName">采集卡名(使用相机专家的枚举名字)</param>
/// <param name="ConfigFilePath">CCF文件路径</param>
/// <param name="ResouceIndex">资源序号,0:灰度图</param>
/// <returns>初始化结果</returns>
USE_DLL long Init(char* ServerName, char* ConfigFilePath, int ResouceIndex);
/// <summary>
/// 释放资源
/// </summary>
/// <returns></returns>
USE_DLL long Release();
/// <summary>
/// 单帧采集
/// </summary>
/// <returns>开启采集的结果</returns>
USE_DLL long Snap();
/// <summary>
/// 采图标记,true:已经采集到图像 false:还没有采集到图像
/// </summary>
/// <returns>当前的采集成功标记</returns>
USE_DLL long SnapFlag();
/// <summary>
/// 获取图像数据
/// </summary>
/// <param name="ImageData">图像指针</param>
/// <param name="ImageWidth">图像宽度</param>
/// <param name="ImageHeight">图像高度</param>
/// <returns></returns>
USE_DLL long GetImageData(void** ImageData, int* ImageWidth, int* ImageHeight);
USE_DLL void Test(void);
*.cpp
#define CPP_FILE
#include "ScanLib.h"
#include <Basic/SapClassBasic.h>
#include <gdiplus.h>
#include <gdipluspixelformats.h>
#pragma comment(lib, "Gdiplus.lib")
using namespace Gdiplus;
using namespace std;
SapAcquisition* g_Acq = NULL;
SapBuffer* g_Buffers = NULL;
SapTransfer* g_Xfer = NULL;
BOOL g_bFlag = FALSE;
BOOL CreateObjects();
BOOL DestroyObjects();
void XferCallback(SapXferCallbackInfo* pInfo);
void write_bmpheader(unsigned char* bitmap, int offset, int bytes, int value)
{
int i;
for (i = 0; i < bytes; i++)
bitmap[offset + i] = (value >> (i << 3)) & 0xFF;
}
unsigned char* convertToBmp(unsigned char* inputImg, int width, int height, int* ouputSize)
{
/*create a bmp format file*/
int bitmap_x = (int)ceil((double)width * 3 / 4) * 4;
unsigned char* bitmap = nullptr;
bitmap = (unsigned char*)malloc(sizeof(unsigned char) * height * bitmap_x + 54);
if (bitmap == nullptr)
{
return bitmap;
}
bitmap[0] = 'B';
bitmap[1] = 'M';
write_bmpheader(bitmap, 2, 4, height * bitmap_x + 54); //whole file size
write_bmpheader(bitmap, 0xA, 4, 54); //offset before bitmap raw data
write_bmpheader(bitmap, 0xE, 4, 40); //length of bitmap info header
write_bmpheader(bitmap, 0x12, 4, width); //width
write_bmpheader(bitmap, 0x16, 4, height); //height
write_bmpheader(bitmap, 0x1A, 2, 1);
write_bmpheader(bitmap, 0x1C, 2, 24); //bit per pixel
write_bmpheader(bitmap, 0x1E, 4, 0); //compression
write_bmpheader(bitmap, 0x22, 4, height * bitmap_x); //size of bitmap raw data
for (int i = 0x26; i < 0x36; i++)
bitmap[i] = 0;
int k = 54;
for (int i = height - 1; i >= 0; i--) {
int j;
for (j = 0; j < width; j++) {
int index = i * width + j;
for (int l = 0; l < 3; l++)
bitmap[k++] = inputImg[index];
}
j *= 3;
while (j < bitmap_x) {
bitmap[k++] = 0;
j++;
}
}
*ouputSize = k;
return bitmap;
}
bool SaveBitmap(char* savepath, void* data, int width, int height)
{
int size;
unsigned char* bmp = convertToBmp((unsigned char*)data, width, height, &size);
FILE* fp = fopen(savepath, "wb+");
if (fp == NULL)
{
/*sprintf(errorText, "Could not open file: %s", outputFileName);
errorMsg(errorText);*/
return false;
}
fwrite(bmp, 1, size, fp);
fclose(fp);
free(bmp);
return true;
}
USE_DLL void EnumDevice(char* acqServerName)
{
int serverCount = SapManager::GetServerCount();
if (serverCount == 0)
{
return;
}
// Scan the boards to find those that support acquisition
BOOL serverFound = FALSE;
for (int serverIndex = 0; serverIndex < serverCount; serverIndex++)
{
if (SapManager::GetResourceCount(serverIndex, SapManager::ResourceAcq) != 0)
{
char serverName[CORSERVER_MAX_STRLEN];
SapManager::GetServerName(serverIndex, serverName, sizeof(serverName));
serverFound = TRUE;
}
}
// At least one acquisition server must be available
if (!serverFound)
{
return;
}
//暂时指定设备ID为1
SapManager::GetServerName(1, acqServerName, CORSERVER_MAX_STRLEN);
return;
}
USE_DLL long Init(char* acqServerName, char* configFileName, int nType)
{
SapLocation loc(acqServerName, nType);
if (SapManager::GetResourceCount(acqServerName, SapManager::ResourceAcq) > 0)
{
g_Acq = new SapAcquisition(loc, configFileName);
g_Buffers = new SapBufferWithTrash(2, g_Acq);
g_Xfer = new SapAcqToBuf(g_Acq, g_Buffers, XferCallback, NULL);
}
return CreateObjects() ? 1 : 0;
}
USE_DLL long Release()
{
DestroyObjects();
// Delete all objects
if (g_Xfer) delete g_Xfer;
//if (g_View) delete g_View;
if (g_Buffers) delete g_Buffers;
if (g_Acq) delete g_Acq;
return 1;
}
USE_DLL long Snap()
{
g_bFlag = FALSE;
return g_Xfer->Snap() ? 1 : 0;
}
USE_DLL long SnapFlag()
{
return g_bFlag ? 1 : 0;
}
USE_DLL long GetImageData(void** pImageData, int* nImageWidth, int* nImageHeight)
{
BOOL bIsReady = TRUE;
if (g_bFlag)
{
*nImageWidth = g_Buffers->GetWidth();
*nImageHeight = g_Buffers->GetHeight();
g_Buffers->GetAddress(pImageData);
SaveBitmap((char*)"D:\\saveimage.bmp", *pImageData, *nImageWidth, *nImageHeight);
bIsReady = FALSE;
return 1;
}
return 0;
}
void Test(void)
{
FILE* test = nullptr;
test = fopen("D:\\lab测试文件", "ab+");
if (test != nullptr)
{
fclose(test);
}
}
BOOL CreateObjects()
{
// Create acquisition object
if (g_Acq && !*g_Acq && !g_Acq->Create())
{
DestroyObjects();
return FALSE;
}
// Create buffer object
if (g_Buffers && !*g_Buffers)
{
if (!g_Buffers->Create())
{
DestroyObjects();
return FALSE;
}
// Clear all buffers
g_Buffers->Clear();
}
// Create transfer object
if (g_Xfer && !*g_Xfer && !g_Xfer->Create())
{
DestroyObjects();
return FALSE;
}
return TRUE;
}
BOOL DestroyObjects()
{
// Destroy transfer object
if (g_Xfer && *g_Xfer)
{
g_Xfer->Destroy();
}
// Destroy buffer object
if (g_Buffers && *g_Buffers)
{
g_Buffers->Destroy();
}
// Destroy acquisition object
if (g_Acq && *g_Acq)
{
g_Acq->Destroy();
}
return TRUE;
}
void XferCallback(SapXferCallbackInfo* pInfo)
{
//Test();
if (!pInfo->IsTrash())
{
//Sleep(1);
g_bFlag = TRUE;
int Img_Width = g_Buffers->GetWidth();
int Img_Height = g_Buffers->GetHeight();
void* addr = nullptr;
g_Buffers->GetAddress(pInfo->GetPairIndex(), &addr);
//#ifdef DEBUG
//
//#endif // DEBUG
SaveBitmap((char*)"D:\\saveimage.bmp", addr, Img_Width, Img_Height);
return;
}
}
然后在Labview调用这个DLL即可
大概就是这样子,由于本人对Labview不熟悉,多余的就不说了,图像转换就更不说了,希望有大佬不吝赐教