知微传感Dkam系列3D相机SDK例程篇:获取内外参
获取3D相机内外参写在前面本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有1、便利他人应用3D相机本系列文章包含公司所出售相机的SDK的使用例程及详细注释2、促进行业发展及交流。欢迎与我深入交流Liu_Gump_获取相机内外参及API说明相机内外参说明知微传感Dkam系列3D相机允许用户获取镜头的畸变参数、内参和外参畸变参数、内参、外参的定义另请自主查询相关APIGetCamInternelParameter 获取相机内参int GetCamInternelParameter(int camera_cnt, float *Kc, float *K)函数功能: 获取相机内部参数参 数: camera_cnCMOS 编号0红外 1RGB; Kc镜头畸变参数(K1,K2,P1,P2,K3)(K1,K2,K3为径向畸变参数P1,P2为切向畸变参数)K镜头的内参fx,0,cx,0,fy,cy,0,0,1返回值: 0设置正常 非 0设置失败GetCamExternelParameter 获取相机外参int GetCamExternelParameter(int camera_cnt, float *R, float *T)函数功能: 获取相机外部参数参 数: camera_cnCMOS 编号0红外 1RGB; R当前镜头相对于红外镜头点云坐标系的旋转矩阵T当前镜头相对于红外镜头点云坐标系的平移向量返回值: 0设置正常 非 0设置失败例程及注释本例程基于WIN10VisualStudio2019DkamSDK_1.6.71,采用C语言DkamSDK的配置方法请参考SDK说明书本例程在D132S型相机上验证// GetParameter.cpp : 此文件包含 main 函数。程序执行将在此处开始并结束。 #include iostream #include cstring //DkamSDK #includedkam_discovery.h #includedkam_gige_camera.h #includedkam_gige_stream.h int main() { std::cout Hello ZHIsensor!std::endl; std::cout Hello liu_sensor! std::endl; std::vectorDiscoveryInfo discovery_info; Discovery discovery; GigeCamera camera; GigeStream* pointgigestream NULL; GigeStream* graygigestream NULL; GigeStream* rgbgigestream NULL; std::vectorDiscoveryInfo().swap(discovery_info); //********************************************查询相机**************************************************** //查询局域网内的3D相机 int camer_num discovery.DiscoverCamera(discovery_info); std::cout 局域网内共有 camer_num 台相机 std::endl; //显示局域网内相机的IP for (int i 0; i camer_num; i) { std::cout 局域网内相机的IP为: discovery.ConvertIpIntToString(discovery_info[i].camera_ip) std::endl; } //********************************************连接相机**************************************************** //选定相机 int k -1; for (int i 0; i camer_num; i) { if (strcmp((discovery.ConvertIpIntToString(discovery_info[i].camera_ip)), 192.168.30.35) 0) { k i; std::cout 将连接第 k 1 台相机 std::endl; } else { std::cout 局域网内无该IP的相机 std::endl; } } //********************************************获取内参**************************************************** //连接相机 int connect camera.CameraConnect(discovery_info[k]); if (connect 0) { std::cout 成功连接相机 std::endl; std::cout std::endl; } else { std::cout 连接相机失败请检查 std::endl; } if (connect 0) { //相机内参 float* kc new float[5]; float* kk new float[9]; //获取红外镜头内参 std::cout 获取红外镜头内参中…… std::endl; int getInternelGray camera.GetCamInternelParameter(0, kc, kk); if (getInternelGray 0) { std::cout 红外镜头内参获取成功 std::endl; } else { std::cout 红外镜头内参获取失败请检查 std::endl; } std::cout 红外镜头畸变参数为 std::endl; std::cout K1 kc[0] std::endl; std::cout K2 kc[1] std::endl; std::cout P1 kc[2] std::endl; std::cout P2 kc[3] std::endl; std::cout K3 kc[4] std::endl; std::cout 红外镜头内参为按行输出 std::endl; for (int z 0; z 9; z) { std::cout kk: kk[z] std::endl; } std::cout std::endl; //获取RGB镜头内参 std::cout 获取RGB镜头内参中…… std::endl; int getInternelRGB camera.GetCamInternelParameter(1, kc, kk); if (getInternelRGB 0) { std::cout RGB镜头内参获取成功 std::endl; } else { std::cout RGB镜头内参获取失败请检查 std::endl; } std::cout RGB镜头畸变参数为 std::endl; std::cout K1 kc[0] std::endl; std::cout K2 kc[1] std::endl; std::cout P1 kc[2] std::endl; std::cout P2 kc[3] std::endl; std::cout K3 kc[4] std::endl; std::cout RGB镜头内参为按行输出 std::endl; for (int z 0; z 9; z) { std::cout kk: kk[z] std::endl; } std::cout std::endl; //********************************************获取外参**************************************************** //外参 float* r new float[9]; float* t new float[3]; std::cout 获取RGB镜头相对红外镜头的外参 std::endl; int getExternel camera.GetCamExternelParameter(1, r, t); if (getExternel 0) { std::cout RGB镜头相对红外镜头的外参获取成功 std::endl; } else { std::cout RGB镜头相对红外镜头的外参获取失败请检查 std::endl; } std::cout RGB镜头相对红外镜头的外参为按行输出 std::endl; for (int j 0; j 9; j) { std::cout R: r[j] std::endl; } for (int z 0; z 3; z) { std::cout T: t[z] std::endl; } delete[]kc; delete[]kk; delete[]r; delete[]t; int disconnect camera.CameraDisconnect(); std::cout 工作结束 std::endl; } return(0); }运行结果后记因为外参是以红外点云坐标系为参考因此获取外参时只获取了RGB镜头的外参