前言
Labview去调用C++封装的用halcon来进行图像处理的DLL进行两者之间的图像数据传输,黑白图的相互传递流程已在上篇文章中详细阐述,链接地址为:https://blog.csdn.net/qq_44869959/article/details/139735965
现在针对彩色图的数据传递做一些阐述。
一、流程
现在准备在Labview加载一张彩色图像,然后传递给封装好的DLL,DLL中对彩色图像进行加法运算,然后将处理完的彩色图像输出给到Labview。
上述流程跟黑白图数据相互传输流程一致,只是多了两步操作:
一、Labview传递给DLL的图像是将彩色图分解为三张R、G、B灰度图,然后在DLL中进行合成为一张彩色图,然后进行彩色的各种算法处理;
二、DLL处理完的彩色图需要分解为三张R、G、B灰度图,得到各自的灰度图指针,将图像数据通过内存拷贝的方式给到Data,上传给到Labview,然后进行RGB合成为一张彩色图进行显示。
二、实现方式
1.头文件代码
代码如下(示例):
#pragma once
#include <string>
#include "HalconCpp.h"
using namespace HalconCpp;
using namespace std;
extern "C"
{
long __declspec(dllexport) dll_main(int Height, int Width, unsigned char* dataR, unsigned char* dataG, unsigned char* dataB);
}
2.CPP代码
代码如下(示例):
#include "Test_H.h"
extern "C"
{
long __declspec(dllexport) dll_main(int Height, int Width, unsigned char* dataR, unsigned char* dataG, unsigned char* dataB)
{
HObject ho_Image, ho_ImageRed, ho_ImageGreen, ho_ImageBlue, ho_ImageAdd;
HTuple hv_Width, hv_Height, hv_Type;
HTuple hv_PointerRed, hv_PointerGreen, hv_PointerBlue;
GenImage1(&ho_ImageRed, "byte", Width, Height, (Hlong)dataR);
GenImage1(&ho_ImageGreen, "byte", Width, Height, (Hlong)dataG);
GenImage1(&ho_ImageBlue, "byte", Width, Height, (Hlong)dataB);
Compose3(ho_ImageRed, ho_ImageGreen, ho_ImageBlue, &ho_Image);
WriteImage(ho_Image, "jpeg", 0, "D:/0CSDN/000.jpg");
AddImage(ho_Image, ho_Image, &ho_ImageAdd, 0.5, 100); //彩色图加法运算
GetImagePointer3(ho_ImageAdd, &hv_PointerRed, &hv_PointerGreen, &hv_PointerBlue, &hv_Type, &hv_Width, &hv_Height);
memcpy(dataR, (unsigned char*)hv_PointerRed.L(), Height * Width);
memcpy(dataG, (unsigned char*)hv_PointerGreen.L(), Height * Width);
memcpy(dataB, (unsigned char*)hv_PointerBlue.L(), Height * Width);
return 0;
}
}
备注:Halcon中的合并图像函数Compose3参数顺序是RGB排列,这点跟OPENCV的合并有一些差异,OPENCV的顺序是BGR,这点需要注意一下。
3.Labview例程
总结
源代码的下载地址为:https://download.csdn.net/download/qq_44869959/89453553