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; } }