Halcon相关讲解:
1.单帧图像多线程方式采集并保存:
https://blog.csdn.net/LeasonQ/article/details/78262104
头文件:
using HalconDotNet;
所需准备:
HObject ho_Image = null;
HTuple hv_AcqHandle = null;
打开相机:
HOperatorSet.GenEmptyObj(out ho_Image);
HOperatorSet.OpenFramegrabber("GenICamTL", 0, 0, 0, 0, 0, 0, "default", -1, "default", -1, "false", "default", "MER-131-210U3M(KG0170060082)", 0, -1, out hv_AcqHandle);
获取图像:
HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
ho_Image.Dispose();
HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
图像显示:
private HTuple WindowID;
HOperatorSet.SetPart(WindowID, 0, 0, ImageHeight, ImageWidth);
HOperatorSet.DispObj(ho_Image, WindowID);
图像保存:
string FileName = DateTime.Now.ToString("yyyy年MM月dd日HH时mm分ss秒fff毫秒");
HOperatorSet.WriteImage(ho_Image, "bmp", 0, Directory.GetCurrentDirectory() + "/image/" + FileName + ".bmp");
关闭相机:
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
ho_Image.Dispose();
2.HObject学习:
图像C#存储格式和Halcon格式的转换:
https://blog.csdn.net/ycigwy/article/details/70227468
主要的GenImage3函数使用:
void fixed (byte* pR = arrayR, pG = arrayG, pB = arrayB)
{
HOperatorSet.GenImage3(out halcon_image, "byte", bmp_data.Width, bmp_data.Height,
new IntPtr(pR), new IntPtr(pG), new IntPtr(pB));
}
将SDK获得的图像转为Bitmap形式:
MemoryStream buffer = new MemoryStream(Image.Buffer);
Bitmap bmp = new Bitmap(buffer);//用BitMap做中转
this.pictureBox1.Image = bmp;
BitmapData bmp_data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);//锁定BitMap
byte* pBmp = (byte*)bmp_data.Scan0;//BitMap的头指针
其中的arrayRGB分别是:
for (int R = 0; R < bmp_data.Height; R++)
{
for (int C = 0; C < bmp_data.Width; C++)
{
//因为内存BitMap的储存方式,行宽用Stride算,C*3是因为这是三通道,另外BitMap是按BGR储存的
byte* pBase = pBmp + bmp_data.Stride * R + C * 3;
arrayR[R * bmp_data.Width + C] = *(pBase + 2);
arrayG[R * bmp_data.Width + C] = *(pBase + 1);
arrayB[R * bmp_data.Width + C] = *(pBase);
}
}
bmp.UnlockBits(bmp_data);//用完了一定要解除锁定
HOperatorSet.DispObj(halcon_image, this.hWindowControl1.HalconWindow);
HOperatorSet.WriteImage(halcon_image, "bmp", 0, "Halcon_Image.bmp");
opencv Mat与Halcon格式转换:
https://blog.csdn.net/jiang111_111shan/article/details/78282765
三通道与上述方法类似一样使用GenImage3,不过在Mat格式的处理上稍有不同:
split(image, imgchannel);
cv::Mat imgB = imgchannel[0];
cv::Mat imgG = imgchannel[1];
cv::Mat imgR = imgchannel[2];
uchar* dataR = new uchar[hgt*wid];
uchar* dataG = new uchar[hgt*wid];
uchar* dataB = new uchar[hgt*wid];
for (i = 0; i<hgt; i++)
{
memcpy(dataR + wid*i, imgR.data + imgR.step*i, wid);
memcpy(dataG + wid*i, imgG.data + imgG.step*i, wid);
memcpy(dataB + wid*i, imgB.data + imgB.step*i, wid);
}
GenImage3(&Hobj, "byte", wid, hgt, (Hlong)dataR, (Hlong)dataG, (Hlong)dataB);
反向转换类似,通道拆分再重新合并,使用了HImage的GetImagePointer3函数将RGB分量从Halcon格式中分出来:
void *Rptr;
void *Gptr;
void *Bptr;
HImage hImg(Hobj);
hImg.GetImagePointer3(&Rptr, &Gptr, &Bptr, &cType, &wid, &hgt);
int W = wid;
int H = hgt;
Image.create(H, W, CV_8UC3);
vector<cv::Mat> VecM(3);
VecM[0].create(H, W, CV_8UC1);
VecM[1].create(H, W, CV_8UC1);
VecM[2].create(H, W, CV_8UC1);
unsigned char *R = (unsigned char *)Rptr;
unsigned char *G = (unsigned char *)Gptr;
unsigned char *B = (unsigned char *)Bptr;
memcpy(VecM[2].data, R, W*H);
memcpy(VecM[1].data, G, W*H);
memcpy(VecM[0].data, B, W*H);
cv::merge(VecM, Image);
Hobject和Htuple常见用法:
http://www.ihalcon.com/read-3866.html
3.HTuple学习:
https://blog.csdn.net/u011058765/article/details/48375623
HTuple::TupleRand(n);
Tuple1.TupleConcat(Tuple2);
TupleGenConst(5,0);
TupleGenSequence(1,10,2);
附:
HTuple tuple;
tuple.TupleInverse()
tuple.TupleSort()
tuple.TupleSortIndex()
https://blog.csdn.net/Taily_Duan/article/details/51026260
// HTuple→VC 数据类型转换
HTuple hTuple = 1234;
int i = hTuple[0].I(); // i=1234
long l = hTuple[0].L(); // l=1234
long lNumber = hTuple.Num(); // lNumber=1,数据个数
double d = hTuple[0].D(); // d=1234.0000
hTuple = "1234";
CString strBuffer = hTuple[0].S(); // strBuffer="1234"
// VC→HTuple 数据类型转换
int ii = 1234;
double dd = 1234.1234;
CString strTemp = "Halcon";
HTuple hTuple2;
hTuple2[0] = ii; // hTuple2[0].I()=1234
hTuple2[1] = dd; // hTuple2[1].D()=1234.1234
hTuple2[2] = strTemp.GetBuffer(); // hTuple2[2].S()="Halcon"
i = hTuple2[0].I(); // i=1234
d = hTuple2[1].D(); // d=1234.1234
strBuffer = hTuple2[2].S(); // strBuffer="Halcon"
lNumber = hTuple2.Num(); // lNumber=3,数据个数