2:点云处理—3D相机开发

1.包含相机库目录

1.include

D:\中科\Ainstec3DViewer\AinstecCamSDK\AinstecCamSDK_CPP\include


2.lib

D:\中科\Ainstec3DViewer\AinstecCamSDK\AinstecCamSDK_CPP\lib\win


3.release

D:\中科\Ainstec3DViewer\AinstecCamSDK\AinstecCamSDK_CPP\bin


4.示例程序

D:\中科\Ainstec3DViewer\AinstecCamSDK\AinstecCamSDK_CPP\samples


5.pro文件路径

cpp 复制代码
INCLUDEPATH += $$PWD/include/CamSDK
INCLUDEPATH += $$PWD/include/CamSDK/3rdparty
INCLUDEPATH += $$PWD/include/CamSDK/3rdparty/libtiff
INCLUDEPATH += $$PWD/include/CamSDK/3rdparty/opencv2
INCLUDEPATH += $$PWD/include/CamSDK/3rdparty/libtiff/include



LIBS += -L$$PWD/lib/CamSDK -lCameraPro
LIBS += -L$$PWD/lib/CamSDK -lCameraProd

LIBS += -L$$PWD/lib/CamSDK/3rdparty/opencv -lopencv_world410
LIBS += -L$$PWD/lib/CamSDK/3rdparty/opencv -lopencv_world410d
LIBS += -L$$PWD/lib/CamSDK/libtiff -ltiff



2.创建UI界面


3.根据示例程序开发

cpp 复制代码
void ChaoFeng3D::SaveFrameDataFiles(AINSTEC::FrameData &frameData, const AINSTEC::CameraInfo& cameraInfo)
{
    std::string path;
    AINSTEC::create_outdir(path);

    //The 'sendPoint3D' of outputSettings in CameraInfo needs to be configured to true
    if (frameData.point3DSize > 0)
        AINSTEC::save_point2pcd_b(frameData, path);

    //The 'sendPoint3D, sendNormals, sendPointColor 'of outputSettings in CameraInfo needs to be configured to true
    if (frameData.point3DSize > 0 && frameData.normalsSize > 0)
        AINSTEC::save_point2ply_normal_color(frameData, path);

    //The 'sendPoint3D, sendPointUV, sendTriangleIndices 'of outputSettings in CameraInfo needs to be configured to true
    if (frameData.point3DSize > 0 && frameData.pointUVSize > 0 && frameData.triangleIndicesSize > 0)
        AINSTEC::save_point2obj(frameData, path);

    //The 'sendTexture'of outputSettings in CameraInfo needs to be configured to true
    if (frameData.textureSize > 0)
        AINSTEC::save_rgb(frameData.texture, &cameraInfo.camParam, path);

    //The 'sendTexture, sendPointUV'of outputSettings in CameraInfo needs to be configured to true
    if (frameData.textureSize > 0 && frameData.pointUVSize > 0)
        AINSTEC::save_rgb_align_depth(frameData.texture, frameData, &cameraInfo.camParam, path);

    //The 'sendDepthmap 'of outputSettings in CameraInfo needs to be configured to true
    if (frameData.depthmapSize > 0) {
        AINSTEC::save_deepmap2tiff(frameData.depthmap, &cameraInfo.camParam, path);
        AINSTEC::save_deepmap(frameData.depthmap, &cameraInfo.camParam, path);
    }

    if (frameData.remapTexture != nullptr)
        AINSTEC::save_ir(frameData.remapTexture, &cameraInfo.camParam, path, true);

    if (frameData.point3D != nullptr && frameData.pointUV != nullptr) { // RGB图与点云的对应(映射)关系,常用于用RGB图分割点云
        AINSTEC::save_IMG_DepthMap2tiff(frameData, cameraInfo.camParam, path);
    }


}


void ChaoFeng3D::CaptureFrameDataConfigure(AINSTEC::CameraInfo & camInfo)
{
    camInfo.outputSettings.sendPoint3D = true;
    camInfo.outputSettings.sendPointUV = true;
    camInfo.outputSettings.sendTriangleIndices = true;
    camInfo.outputSettings.sendDepthmap = true;
    camInfo.outputSettings.sendNormals = true;
    camInfo.outputSettings.sendPointColor = true;
    camInfo.outputSettings.sendTexture = true;
    camInfo.outputSettings.sendRemapTexture = true;

    if (camInfo.rgbStatus == AC_E_NOT_EXSIT) { // 不支持rgb相关操作
        camInfo.outputSettings.sendPointUV = false;
        camInfo.outputSettings.sendPointColor = false;
        camInfo.outputSettings.sendTexture = false;
    }
}


void ChaoFeng3D::PrintFrameDataInfo(const AINSTEC::FrameData &frameData, const AINSTEC::CameraInfo& cameraInfo)
{
    std::cout << "  Camera irWidth:          " << cameraInfo.camParam.irWidth << std::endl;
    std::cout << "  Camera irHeight:         " << cameraInfo.camParam.irHeight << std::endl;
    std::cout << "  Camera textureWidth:     " << cameraInfo.camParam.textureWidth << std::endl;
    std::cout << "  Camera textureHeight:    " << cameraInfo.camParam.textureHeight << std::endl << std::endl;

    std::cout << "   point3DSize:            " << frameData.point3DSize << std::endl;
    std::cout << "   pointUVSize:            " << frameData.pointUVSize << std::endl;
    std::cout << "   triangleIndicesSize:    " << frameData.triangleIndicesSize << std::endl;
    std::cout << "   depthmapSize:           " << frameData.depthmapSize << std::endl;
    std::cout << "   normalsSize:            " << frameData.normalsSize << std::endl;
    std::cout << "   pointColorSize:         " << frameData.pointColorSize << std::endl;
    std::cout << "   textureSize:            " << frameData.textureSize << std::endl;
    std::cout << "   remapTextureSize:       " << frameData.remapTextureSize << std::endl;
    std::cout << "   pointCount:             " << frameData.pointCount << std::endl;



    /*自己添加编写
    point3D:3D 点云数据,存储格式为 xyzxyz......,其长
    度为 point3DSize,与 irWidth * irHeight * 3 相同。点数
    为 pointCount,与 point3DSize/3 相同;  1310000
    */

    //012  345  678
    qDebug()<<"x:="<<frameData.point3D[0];
    qDebug()<<"y:="<<frameData.point3D[1];
    qDebug()<<"z:="<<frameData.point3D[2];


    //转换成为halcon数据
    HTuple  hv_x, hv_y, hv_z,hv_ObjectModel3D;
    //*frameData.pointCount  点的个数
    //*frameData.point3D  =frameData.pointCount*3
    for (int i=0;i<frameData.pointCount;i++)
    {
        hv_x[i]=frameData.point3D[i*3+0];
        hv_y[i]=frameData.point3D[i*3+1];
        hv_z[i]=frameData.point3D[i*3+2];
    }
    GenObjectModel3dFromPoints(hv_x, hv_y, hv_z, &hv_ObjectModel3D);
    WriteObjectModel3d(hv_ObjectModel3D, "om3", "object55.om3", HTuple(), HTuple());

}


//More info is available after open camera
void ChaoFeng3D:: PrintCameraInfo(const std::vector<AINSTEC::CameraInfo> camInfoVector)
{
    for (int i = 0; i < camInfoVector.size(); i++)
    {
        printf("[Camera index %d]:\n", i);
        AINSTEC::CameraInfo cameraInfo = camInfoVector[i];
        std::cout << "  Camera IP:              " << cameraInfo.cameraIP << std::endl;
        std::cout << "  Serial Number:          " << cameraInfo.serialNum << std::endl;
        std::cout << "  Mac Address:            " << cameraInfo.macAddr << std::endl;
        std::cout << "  Camera Version:         " << cameraInfo.cameraSystemVersion << std::endl;
        std::cout << "  Model:                  " << cameraInfo.cameraModel << std::endl;
        std::cout << "  Is DHCP:                " << (0 == cameraInfo.isDHCP ? "No" : "Yes") << std::endl;
        std::cout << "  Status:                 " << (AC_OK == cameraInfo.errorCode ? "Ready" : "Error") << std::endl;
    }
}

int ChaoFeng3D::DiscoverCameras(AINSTEC::Camera * cameraPtr, AINSTEC::CameraInfo &cameraInfo)
{
    //Get List of available devices on the network
    std::vector<AINSTEC::CameraInfo> camInfoVector;
    int ret = cameraPtr->DiscoverCameras(camInfoVector);
    if (AC_OK != ret) {
        std::cout << "No cameras found, ret :" << ret << std::endl;
        AINSTEC::DestoryCamera(cameraPtr);
        return ret;
    }

    //Print out camera info
    PrintCameraInfo(camInfoVector);

    //Select the camera to open, the default is the first one
    unsigned int nIndex = 0;
    if (camInfoVector.size() > 1)
    {
        std::cout << "Please Input camera index: " << std::endl;
        cin >> nIndex;
        if (nIndex >= camInfoVector.size() || nIndex < 0)
        {
            std::cout << "Input error, the default selection index is 0.\n" << std::endl;
            nIndex = 0;
        }
    }

    cameraInfo = camInfoVector[nIndex];
    return ret;
}




//打开相机函数
int  ChaoFeng3D::OpenCamera()
{
    cameraPtr = AINSTEC::CreateCamera(AINSTEC::CamType::CamPro);

    int ret = DiscoverCameras(cameraPtr, cameraInfo);
    if (AC_OK != ret) {
        std::cout << "Discover camera failed, ret :" << ret << std::endl;
        return ret;
    }

    ret = cameraPtr->Open(cameraInfo);
    if (AC_OK != ret) {
        std::cout << "Camera open failed, ret :" << ret << std::endl;
        AINSTEC::DestoryCamera(cameraPtr);
        return ret;
    }

    //Configure the type of FrameData before capturing
    CaptureFrameDataConfigure(cameraInfo);

    //Configure TriggerMode to software trigger, TriggerMode defaults to the software trigger
    cameraPtr->SetValue(cameraInfo, "TriggerMode", AINSTEC::CameraWorkMode::Camera_SoftTrigger);


    return AC_OK;
}


//打开相机
void ChaoFeng3D::on_pB_OpenCamera_clicked()
{
    OpenCamera();
}

//关闭相机
void ChaoFeng3D::on_pB_CloseCamera_clicked()
{
    //Disconnect from camera
    cameraPtr->Close(cameraInfo);

    //Destory from camera
    AINSTEC::DestoryCamera(cameraPtr);
}

//拍照
void ChaoFeng3D::on_pB_Capture3DPointCloud_clicked()
{
    AINSTEC::FrameData frameData;
    int ret = cameraPtr->Capture(cameraInfo, frameData);
    if (AC_OK != ret) {
        std::cout << "Camera Capture failed, ret :" << ret << std::endl;
        AINSTEC::DestoryCamera(cameraPtr);
        return ;
    }

    //Print out FrameData info
    PrintFrameDataInfo(frameData, cameraInfo);

    //Save FrameData in multiple formats
    SaveFrameDataFiles(frameData, cameraInfo);
}

4.附录

在示例程序的函数中PrintFrameDataInfo需要打印添加自己的程序。需要导出C++

HALCON程序:

cpp 复制代码
*读取三维点云 
dev_get_window(WindowHandle)

dev_open_window(0, 0, 512, 512, 'black', WindowHandle1)


*彩色显示用的    0-----渐变色  ----伪彩图
GenParamNames := ['lut','intensity','light_position','disp_pose','alpha']
GenParamValues := ['color1','coord_z','0.0 0.0 -0.3 1.0','true',1]


* read_tuple('x', x)
* read_tuple('y', y)
* read_tuple('z', z)
* x:=[1,2]
* y:=[1,2]
* z:=[1,2]
* gen_object_model_3d_from_points(x, y, z, ObjectModel3D)

* write_object_model_3d(ObjectModel3D, 'om3', 'object55.om3', [], [])
read_object_model_3d('object55.om3', 'mm', [], [], ObjectModel3D, Status)


visualize_object_model_3d (WindowHandle1,ObjectModel3D, [],[],  \
                     GenParamNames,GenParamValues, [], [],\
                       [],  DispPose)
相关推荐
曾经的三心草几秒前
深度学习1-简介-简单实现-手写数字识别
人工智能·深度学习
程序猿小D6 分钟前
【完整源码+数据集+部署教程】【零售和消费品&存货】价格标签检测系统源码&数据集全套:改进yolo11-RFAConv
前端·yolo·计算机视觉·目标跟踪·数据集·yolo11·价格标签检测系统源码
滑水滑成滑头9 分钟前
**点云处理:发散创新,探索前沿技术**随着科技的飞速发展,点云处理技术在计算机视觉、自动驾驶、虚拟现实等领域的应用愈发广
java·python·科技·计算机视觉·自动驾驶
拓端研究室12 分钟前
专题:2025年医疗健康行业状况报告:投融资、脑机接口、AI担忧|附130+份报告PDF合集、图表下载
大数据·人工智能
violet-lz33 分钟前
数据结构四大简单排序算法详解:直接插入排序、选择排序、基数排序和冒泡排序
数据结构·算法·排序算法
盘古信息IMS35 分钟前
告别 “老系统困境”!三真科技 × 盘古信息:汽车电子数字化工厂升级
人工智能·科技·汽车
·白小白37 分钟前
力扣(LeetCode) ——118.杨辉三角(C++)
c++·算法·leetcode
Alter123040 分钟前
用AI重构人机关系,OPPO智慧服务带来了更“懂你”的体验
人工智能·重构
爱看科技41 分钟前
科技新突破!微美全息(NASDAQ:WIMI)研发保留运动想象脑机接口“方差密钥”技术
大数据·人工智能·科技
中科岩创1 小时前
青海某公路水渠自动化监测服务项目
大数据·人工智能·物联网