Halcon

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,数据个数


猜你喜欢

转载自blog.csdn.net/parallel2333/article/details/80400659