HObject cv::Mat 互相转换

void Mat2HObject(const Mat &image, HObject &outObj)
{
    HObject Hobj = HObject();
    int hgt = image.rows;
    int wid = image.cols;
    int i;
    //	CV_8UC3
    if (image.type() == CV_8UC3)
    {
        vector<Mat> imgchannel;
        split(image, imgchannel);
        Mat imgB = imgchannel[0];
        Mat imgG = imgchannel[1];
        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);
        delete[]dataR;
        delete[]dataG;
        delete[]dataB;
        dataR = NULL;
        dataG = NULL;
        dataB = NULL;
    }
    //	CV_8UCU1
    else if (image.type() == CV_8UC1)
    {
        uchar *data = new uchar[hgt * wid];
        for (i = 0; i < hgt; i++)
            memcpy(data + wid * i, image.data + image.step * i, wid);
        GenImage1(&Hobj, "byte", wid, hgt, (Hlong)data);
        delete[] data;
        data = NULL;
    }
    outObj = Hobj;
}

void HObject2Mat(const HObject &_Hobj, cv::Mat &outMat)
{
    HTuple htCh = HTuple();
    HString cType;
    cv::Mat Image;
    HObject Hobj;
    ConvertImageType(_Hobj, &Hobj, "byte");
    CountChannels(Hobj, &htCh);
    Hlong w;
    Hlong h;
    if (htCh[0].I() == 1)
    {
        void* ptr = ((HImage)Hobj).GetImagePointer1(&cType, &w, &h);
        Image.create(h, w, CV_8UC1);
        uchar *pdata = static_cast<unsigned char *>(ptr);
        memcpy(Image.data, pdata, w * h);
    }
    else if (htCh[0].I() == 3)
    {
        void** pr=nullptr;
        void** pg = nullptr;
        void** pb = nullptr;
        ((HImage)Hobj).GetImagePointer3(pr, pg, pb, &cType,&w, &h);
        Image.create(h, w, CV_8UC3);
        std::vector<cv::Mat> vecM(3);
        vecM[2].create(h, w, CV_8UC1);
        vecM[1].create(h, w, CV_8UC1);
        vecM[0].create(h, w, CV_8UC1);
        memcpy(vecM[2].data, pr, w * h);
        memcpy(vecM[1].data, pg, w * h);
        memcpy(vecM[0].data, pb, w * h);
        merge(vecM, Image);
    }
    outMat = Image;
}

 

### Halcon 模板匹配的实现 #### 创建 NCC 模型 为了准备一个模板,`create_ncc_model` 操作符接收图像 `Template` 并将其转换为 ncc 模型。此过程涉及计算归一化互相关系数,以便后续可以在其他图像中高效地找到相似区域[^1]。 ```cpp // C++ 示例代码展示如何创建NCC模型 HObject ho_TemplateImage; HTuple hv_ModelID; // 加载模板图像 read_image(ho_TemplateImage, "path_to_template"); // 创建NCC模型 create_ncc_model(ho_TemplateImage, &hv_ModelID); ``` #### 形状基础的模板匹配 除了基于灰度的相关性方法外,还有基于形状的方法来提高鲁棒性和准确性。这种方法通过轮廓特征而不是整个图像的内容来进行匹配,在复杂背景下特别有用[^2]。 ```cpp // 使用OpenCV模拟HALCON中的形状匹配功能 cv::Mat templateImg = cv::imread("template.png", 0); cv::Mat targetImg = cv::imread("target.png", 0); std::vector<cv::Point> matchLocs; double threshold = 0.8; // 进行模板匹配并获取位置 matchShapes(templateImg, targetImg, CV_CONTOURS_MATCH_I1, matchLocs, threshold); ``` #### 多种模式下的模板匹配 对于更复杂的场景需求,可以组合多种策略如基于形状、基于灰度、基于相关性的算法以及支持变化的比例因子等特性。这允许在一个统一框架内处理不同类型的对象识别任务[^3]。 ```csharp using System.Collections.Generic; using HalconDotNet; public class MultiModeTemplateMatching { private HTuple modelIDs; public void AddTemplate(string imagePath){ HObject image = new HObject(); read_image(out image, imagePath); // 添加更多参数配置以适应特定应用场景的需求 create_shape_model(image, out var id, ... ); this.modelIDs.TupleConcat(id); } public List<HObject> FindMatches(HObject sceneImage){ List<HObject> matches = new List<HObject>(); foreach(var id in this.modelIDs){ find_shape_models(sceneImage, id, ..., out var foundModels); matches.AddRange(foundModels); } return matches; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值