当前位置: 首页 > news >正文

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文件路径

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/includeLIBS += -L$$PWD/lib/CamSDK -lCameraPro
LIBS += -L$$PWD/lib/CamSDK -lCameraProdLIBS += -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.根据示例程序开发

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 trueif (frameData.point3DSize > 0)AINSTEC::save_point2pcd_b(frameData, path);//The 'sendPoint3D, sendNormals, sendPointColor 'of outputSettings in CameraInfo needs to be configured to trueif (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 trueif (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 trueif (frameData.textureSize > 0)AINSTEC::save_rgb(frameData.texture, &cameraInfo.camParam, path);//The 'sendTexture, sendPointUV'of outputSettings in CameraInfo needs to be configured to trueif (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 trueif (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  678qDebug()<<"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*3for (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 networkstd::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 infoPrintCameraInfo(camInfoVector);//Select the camera to open, the default is the first oneunsigned 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 capturingCaptureFrameDataConfigure(cameraInfo);//Configure TriggerMode to software trigger, TriggerMode defaults to the software triggercameraPtr->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 cameracameraPtr->Close(cameraInfo);//Destory from cameraAINSTEC::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 infoPrintFrameDataInfo(frameData, cameraInfo);//Save FrameData in multiple formatsSaveFrameDataFiles(frameData, cameraInfo);
}

4.附录

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

HALCON程序:

*读取三维点云 
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)

相关文章:

  • 追踪大型语言模型的思想(上)(来自针对Claude的分析)
  • 鸿蒙开发——1.ArkTS声明式开发(UI范式基本语法)
  • ClimateCatcher专用CDS配置教程
  • 如何在自己的服务器上部署静态网页并通过IP地址进行访问
  • 电池管理系统BMS三级架构——BMU、BCU和BAU详解
  • 前端面试测试题目(一)
  • 密码学系列 - SR25519与ED25519
  • English of Root for May 7th
  • C++ 日志系统实战第四步:设计与代码实现详解
  • Vivo 手机官网交互效果实现解析
  • 【ASP.net】在Windows 11上安装IIS并测试C# Web项目的踩坑实录
  • vue3+ts的computed属性怎么用?
  • css animation 动画属性
  • 基于大模型的子宫平滑肌瘤全周期预测与诊疗方案研究
  • 细究Java三大特性之封装、继承、多态
  • Spark jdbc写入崖山等国产数据库失败问题
  • 数据可视化:php+echarts实现数据可视化
  • 16.状态模式:思考与解读
  • 明远智睿SD2351核心板:工业AIoT时代的创新引擎
  • MapReduce中的分区器
  • 家电维修担心遇“李鬼”?上海推动“物业+专业服务”进社区
  • 习近平结束对俄罗斯国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典回到北京
  • 花2万多在海底捞办婚礼,连锁餐企要抢酒楼的婚宴生意?
  • 保证断电、碰撞等事故中车门系统能够开启!汽车车门把手将迎来强制性国家标准
  • 视频丨习近平同普京会谈:共同弘扬正确二战史观,维护联合国权威和地位
  • 司法部:加快研究制定行政执法监督条例,建立完善涉企行政执法监督长效机制