Halcon:HObject与opencv:Mat互转
- 1. Mat转HObject
- 2. HObject转Mat
1. Mat转HObject
void MatToHObject(Mat mat, out HObject hObj)
{
int width = mat.Width;
int height = mat.Height;
HTuple type, pointer, widthTuple, heightTuple;
if (mat.Channels() == 1)
{
type = "byte";
pointer = new HTuple(mat.Data);
widthTuple = width;
heightTuple = height;
HOperatorSet.GenImage1(out hObj, type, width, height, pointer);
}
else if (mat.Channels() == 3)
{
Mat rgb = new Mat();
Cv2.CvtColor(mat, rgb, ColorConversionCodes.BGR2RGB);
HTuple redPointer = new HTuple(rgb.Data);
HTuple greenPointer = new HTuple(rgb.Data + 1);
HTuple bluePointer = new HTuple(rgb.Data + 2);
widthTuple = width;
heightTuple = height;
HOperatorSet.GenImageInterleaved(out hObj, redPointer, greenPointer, bluePointer, "rgb", width, height, 8, "byte", 0, 0, -1, 0);
}
else
{
hObj = new HObject();
}
}
2. HObject转Mat
[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);
[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
public static extern void CopyMemory(int dest, int src, int count);
public static Mat HObjectToMat(HObject hobj)
{
try
{
Mat pImage;
HTuple htChannels;
HTuple cType = null;
HTuple width, height;
width = height = 0;
htChannels = null;
HOperatorSet.CountChannels(hobj, out htChannels);
if (htChannels.Length == 0)
{
return null;
}
if (htChannels[0].I == 1)
{
HTuple ptr;
HOperatorSet.GetImagePointer1(hobj, out ptr, out cType, out width, out height);
pImage = new Mat(new OpenCvSharp.Size(width, height), MatType.CV_8UC1, new Scalar(0));
int Width = width;
unsafe
{
for (int i = 0; i < height; i++)
{
IntPtr start = IntPtr.Add(pImage.Data, i * width);
CopyMemory(start, new IntPtr((byte*)ptr.IP + width * i), (uint)width);
}
}
return pImage;
}
else if (htChannels[0].I == 3)
{
HTuple ptrRed;
HTuple ptrGreen;
HTuple ptrBlue;
HOperatorSet.GetImagePointer3(hobj, out ptrRed, out ptrGreen, out ptrBlue, out cType, out width, out height);
Mat pImageRed = new Mat(new OpenCvSharp.Size(width, height), MatType.CV_8UC1);
Mat pImageGreen = new Mat(new OpenCvSharp.Size(width, height), MatType.CV_8UC1);
Mat pImageBlue = new Mat(new OpenCvSharp.Size(width, height), MatType.CV_8UC1);
pImage = new Mat(new OpenCvSharp.Size(width, height), MatType.CV_8UC3, new Scalar(0, 0, 0));
unsafe
{
for (int i = 0; i < height; i++)
{
long step = pImage.Step();
IntPtr startRed = IntPtr.Add(pImageRed.Data, i * width);
IntPtr startGreen = IntPtr.Add(pImageGreen.Data, i * width);
IntPtr startBlue = IntPtr.Add(pImageBlue.Data, i * width);
CopyMemory(startRed, new IntPtr((byte*)ptrRed.IP + width * i), (uint)width);
CopyMemory(startGreen, new IntPtr((byte*)ptrGreen.IP + width * i), (uint)width);
CopyMemory(startBlue, new IntPtr((byte*)ptrBlue.IP + width * i), (uint)width);
}
}
Mat[] multi = new Mat[] { pImageBlue, pImageGreen, pImageRed };
Cv2.Merge(multi, pImage);
pImageRed.Dispose();
pImageGreen.Dispose();
pImageBlue.Dispose();
return pImage;
}
else
{
return null;
}
}
catch (Exception ex)
{
throw ex;
}
}