FEATURED · 精选文章

工业级双目立体视觉深度测量实战:C++ OpenCV硬核调优指南

发布时间 / 2026/9/3 5:04:11
来源 / 创域科博编辑部
栏目 / 资讯中心
工业级双目立体视觉深度测量实战:C++ OpenCV硬核调优指南 简介本资源是一套基于OpenCV与C实现的双目立体视觉深度测量系统面向计算机视觉初学者、嵌入式开发者及机器人/工业检测领域工程师解决三维空间中非接触式精确测距问题。项目完整实现相机标定、极线校正、SGBM立体匹配、三角测量深度计算等核心流程并集成多线程图像采集、实时测距显示、点云可视化与参数配置界面支持毫米级精度调优。压缩包共70个文件含40张标定与测试用左右视图JPG、3张校正结果图PNG、2个主程序源码CPP、多个Visual Studio工程配置文件VCXPROJ/SUO/FILTERS及XML标定参数文件整体大小2.73MB结构清晰便于编译调试与模块化学习。目前已有73人下载学习提供可直接运行的工程框架、完整配置逻辑与误差补偿机制是深入理解双目视觉原理与工程落地的优质实践参考。1. 这不是“调个库就能跑”的玩具项目而是工业级深度测量的硬核入口双目立体视觉深度测量——这个词在OpenCV教程里常被简化成“左右图匹配→视差图→深度图”三步走但真正把它用在产线零件尺寸检测、AGV避障或机械臂抓取上时你会发现90%的失败不是因为算法错了而是因为你根本没搞懂相机标定到底在标什么、极线约束为什么必须严格满足、亚像素匹配为何在金属反光表面集体失效。我带过三个工业视觉项目最早一次用OpenCV自带的stereoBM跑通Demo后兴奋地拿去测铝制齿轮结果深度误差高达±8mm而客户要求是±0.3mm。后来拆开整个流程重做才发现问题全出在标定板摆放角度偏差2°、图像畸变校正残留0.5像素偏移、以及SGBM参数中P1/P2设置完全照搬文档却忽略了金属表面纹理稀疏的特性。这篇内容不讲“如何安装OpenCV”也不堆砌公式推导而是直接复盘一个真实可落地的C双目系统从硬件选型的隐性坑比如为什么USB3.0双目模组比千兆网双目更难同步、到标定阶段必须手绘的极线对齐验证图、再到SGBM匹配后如何用几何约束过滤掉70%的误匹配点——所有步骤都附带实测数据和调试日志片段。如果你正在用OpenCV写C双目代码却还在为视差图里大片噪点发愁或者发现同一块标定板在不同光照下标定结果漂移超过0.3像素那这篇就是为你写的。它覆盖的是工业现场真正在用的方案不是实验室里跑通就完事的Demo。2. 硬件层双目相机选型的五个致命盲区90%的人栽在第一步很多人以为双目系统只要买一对同型号USB摄像头就行实际在C工程里硬件选型错误会导致后续所有算法优化都白费。我见过最典型的翻车案例某团队采购了两台标称“全局快门、120fps”的USB3.0工业相机接上Ubuntu 20.04后发现左右图时间戳相差最大达42ms导致运动物体深度跳变。问题根源不在OpenCV而在硬件底层——USB总线带宽争抢、驱动未启用硬件触发同步、甚至相机内部晶振温漂差异。下面这五个维度缺一不可2.1 同步机制硬件触发 vs 软件时间戳精度差两个数量级硬件触发推荐必须支持外部TTL信号输入通过FPGA或PLC输出同步脉冲确保左右相机感光时刻误差1μs。我们用的Basler acA1920-40gm其GPIO口支持“Trigger Delay”微调实测左右帧时间差稳定在±0.3μs。软件时间戳慎用依赖操作系统调度Linux下即使用clock_gettime(CLOCK_MONOTONIC_RAW)获取时间戳USB摄像头驱动层仍存在10~50ms抖动。曾用Logitech C920测试在CPU负载70%时时间戳偏差达67ms。关键验证写一段C程序连续采集1000对图像计算每对图像abs(left_timestamp - right_timestamp)直方图峰值应集中在100μs区间。若1ms立即换硬件。2.2 镜头与基线不是越长越好而是要匹配目标距离双目基线长度B与目标距离Z的关系由Z (f*B)/d决定f为焦距d为视差。常见误区是盲目追求长基线提升远距精度却忽略近距测量盲区基线120mm 焦距6mm镜头 → 最小可测距离约1.2m视差d超像素范围基线60mm 焦距12mm镜头 → 最小可测距离0.6m且在1~3m区间深度噪声更低 我们为汽车内饰件检测选60mm基线因工件距相机0.8~2.5m而为仓库货架识别选120mm基线因目标距离5~15m。实测数据同一套SGBM参数下60mm基线在1m处深度标准差0.8mm120mm基线在1m处因视差过小导致噪声飙升至4.2mm。2.3 分辨率与帧率必须用ROI裁剪而非降采样双目匹配计算量随分辨率平方增长。1920x1080图像用SGBM需2.3s/帧i7-8700K无法实时。但直接用cv::resize()降采样会破坏像素对应关系导致极线约束失效。正确做法是在相机驱动层设置ROI如1280x720中心区域OpenCV中用cv::Rect(320,140,1280,720)截取保留原始像素精度我们用Aravis SDK配置Basler相机ROI实测1280x720下SGBM耗时降至380ms/帧深度图信噪比比resize方案高3.2dB2.4 畸变模型不要迷信“径向切向”鱼眼镜头必须用fisheye模块普通镜头用cv::calibrateCamera()标定输出k1,k2,p1,p2,k3。但鱼眼镜头如Raspberry Pi HQ Camera配6mm鱼眼若强行用此模型标定残差0.8像素。必须切换到cv::fisheye::calibrate()// 鱼眼标定关键代码 std::vectorcv::Mat rvecs, tvecs; cv::Mat K cv::Mat::eye(3, 3, CV_64F); // 内参初值 cv::Mat D cv::Mat::zeros(4, 1, CV_64F); // 畸变系数 cv::fisheye::calibrate(objectPoints, imagePoints, imageSize, K, D, rvecs, tvecs, cv::CALIB_FIX_SKEW | cv::CALIB_CHECK_COND);实测对比同一组棋盘格图像普通标定在图像边缘重投影误差1.7像素鱼眼标定后降至0.23像素。2.5 接口协议USB3 Vision vs GigE Vision选错等于放弃实时性USB3 Vision带宽5Gbps但需处理USB总线仲裁。我们用uvc_driver时发现当同时运行OpenCV GUI窗口USB带宽占用率达92%导致丢帧。解决方案关闭GUI用cv::VideoWriter直接存raw帧。GigE Vision带宽1Gbps但支持Jumbo Frame9000字节和Precision Time ProtocolPTP实测左右相机时间同步精度达±200ns。代价是需额外配置交换机PTP主时钟。关键指标查厂商手册确认“Frame Rate Consistency”参数工业相机应≤0.1%波动。消费级摄像头此项常标“N/A”。提示采购前务必索要相机SDK用其自带的同步测试工具验证。我们曾因忽略此步收到货后才发现某品牌USB双目模组的“硬件同步”仅指LED指示灯同步实际图像捕获无任何同步机制。3. 标定层为什么你的重投影误差0.1像素却测不准极线校验才是生死线OpenCV标定函数返回的平均重投影误差如0.08像素只是数学拟合优度不代表极线约束满足度。我见过太多项目卡在这里标定报告完美但立体匹配时大量匹配点偏离极线超5像素导致深度图满屏噪点。根本原因是标定板姿态、光照均匀性、图像质量等隐性因素未被量化控制。3.1 标定板制作A4纸打印那是给Demo用的工业场景必须用高精度蚀刻铝板标定板原因有三A4纸受温湿度影响翘曲实测25℃→35℃环境变化导致棋盘格角点坐标漂移0.3~0.7像素普通喷墨打印墨水反光率不均强光下某些格子对比度骤降OpenCV角点检测失败率15%蚀刻铝板表面粗糙度Ra0.2μm各方向反射率偏差3%角点检测重复精度±0.05像素我们定制的20x15格标定板格子尺寸20mm经三坐标测量仪验证相邻格子中心距误差±1.2μm。成本约800但节省了后期3天以上的标定调试时间。3.2 标定图像采集12张图够吗看这3个硬性条件OpenCV文档说“10~20张不同姿态图像”但工业现场必须满足角度覆盖俯仰角-30°~30°、偏航角-45°~45°、滚转角-15°~15°用倾角传感器贴在标定板背面实时监控距离梯度最近点距相机0.5BB为基线最远点距相机3B确保景深范围内畸变充分激发光照一致性用照度计监测所有图像采集时光照强度波动±50lux。我们用LED面光源漫射板照度稳定在800±20lux实测数据若只拍12张图但滚转角全在±5°内标定后极线校验失败率40%按上述条件拍18张失败率降至2%。3.3 极线校验手写代码验证别信标定函数的“成功”返回标定完成后必须人工验证极线约束。方法很简单取左图一个角点p1用本质矩阵E计算其在右图的极线l2 E*p1再检查右图对应角点p2到l2的距离是否0.5像素。写一段C验证代码cv::Mat E cv::findEssentialMat(points1, points2, K, cv::RANSAC, 0.999, 1.0, mask); std::vectorcv::Vec3d lines2; cv::computeCorrespondEpilines(points1, 1, E, lines2); // 计算右图极线 double max_epipolar_error 0; for (size_t i 0; i points2.size(); i) { double error fabs(lines2[i][0] * points2[i].x lines2[i][1] * points2[i].y lines2[i][2]) / sqrt(lines2[i][0]*lines2[i][0] lines2[i][1]*lines2[i][1]); max_epipolar_error std::max(max_epipolar_error, error); } // 若max_epipolar_error 0.8标定失败必须重采图我们某次标定后max_epipolar_error1.23排查发现是标定板在第7张图拍摄时被空调风吹动导致该图角点坐标系统性偏移。剔除该图重标定后降至0.31。3.4 畸变校正cv::initUndistortRectifyMap的隐藏陷阱cv::stereoRectify()输出的R1,R2,P1,P2用于生成校正映射表但这里有个致命细节cv::initUndistortRectifyMap()的newCameraMatrix参数若传入cv::getOptimalNewCameraMatrix()计算的矩阵会导致有效视场缩小30%。正确做法是newCameraMatrix设为K原始内参矩阵validPixROI参数返回的有效区域必须用于后续图像裁剪cv::Rect validRoi1, validRoi2; cv::stereoRectify(K1, D1, K2, D2, imageSize, R, T, R1, R2, P1, P2, Q, cv::CALIB_ZERO_DISPARITY, 0, imageSize, validRoi1, validRoi2); cv::initUndistortRectifyMap(K1, D1, R1, P1, imageSize, CV_32FC1, map11, map12); cv::initUndistortRectifyMap(K2, D2, R2, P2, imageSize, CV_32FC1, map21, map22); // 校正后必须裁剪left_rect left_rect(validRoi1); right_rect right_rect(validRoi2);未裁剪时图像边缘出现大面积黑色填充这些区域参与SGBM匹配会生成虚假深度。裁剪后有效像素数提升22%匹配成功率提高35%。3.5 双目标定结果验证用已知尺寸物体做闭环测试标定完成不能只看数字必须实物验证。我们用直径50.00±0.02mm的标准钢球固定钢球于三轴位移台上沿Z轴移动5个位置0.5m, 1.0m, 1.5m, 2.0m, 2.5m每位置采集100对图像计算钢球中心深度均值及标准差实测结果理论深度与测量深度偏差0.15mm1.0m标准差0.28mm满足工业检测要求若偏差0.5mm检查基线长度B是否用游标卡尺实测而非厂商标称值注意验证时钢球表面必须清洁无划痕否则镜面反射导致SGBM匹配失败。我们用无尘布蘸异丙醇擦拭再用压缩空气吹干。4. 匹配层SGBM不是黑盒这7个参数决定90%的深度图质量cv::StereoSGBM是OpenCV双目匹配的主力算法但多数人只调numDisparities和blockSize。实际上P1/P2、uniquenessRatio、speckleWindowSize等参数对金属、塑料、织物等不同材质的适应性差异极大。我们针对汽车零部件高反光金属哑光塑料做了217组参数组合测试以下是工业现场验证有效的配置逻辑。4.1blockSize不是越大越好而是要匹配纹理尺度blockSize决定匹配窗口大小直接影响小值3~5适合纹理丰富区域如电路板但噪声大大值11~15抑制噪声但会模糊细小结构如螺丝螺纹材质适配法则金属表面镜面反射用blockSize7因高光区域纹理缺失大窗口会误匹配塑料外壳漫反射用blockSize11有效抑制散粒噪声织物/纸张用blockSize5保留纤维细节我们实测同一套汽车仪表盘图像blockSize7时深度图能清晰分辨2mm宽的按键缝隙blockSize11时缝隙被平滑掉。4.2numDisparities与minDisparity必须用视场角反推而非拍脑袋numDisparities决定视差搜索范围设错会导致近距或远距目标丢失公式numDisparities floor((B * f) / Z_min) - floor((B * f) / Z_max)其中B为基线mf为焦距pixelZ_min/Z_max为测量范围m例如B0.06m,f1200px,Z_min0.8m,Z_max2.5m→numDisparities floor(72) - floor(28.8) 44向上取16的倍数得48minDisparity设为floor((B*f)/Z_max) 28确保远距目标不被截断。我们曾因numDisparities设为64默认值导致1.5m外的物体深度值全为0。4.3P1/P2控制平滑性的核心材质不同必须重调P1相邻像素视差变化惩罚和P2非相邻像素视差变化惩罚是SGBM的“柔顺度”调节器P1 8 * blockSize * blockSizeP2 32 * blockSize * blockSizeOpenCV默认但这是为自然图像优化的工业材质修正系数材质类型P2修正系数原因镜面金属×0.3高光区域视差突变正常过度平滑会抹掉边缘哑光塑料×1.0默认值适用深色织物×1.8纹理弱需更强平滑抑制噪声实测汽车引擎盖镜面金属用默认P2256深度图边缘严重过平滑改为P276后螺栓轮廓清晰度提升300%。4.4uniquenessRatio解决“一对多”匹配的终极开关当uniquenessRatio15默认时若最佳匹配代价与次佳匹配代价比值1.15该像素匹配被拒绝置为0。这对高反光表面至关重要镜面金属设uniquenessRatio5容忍更多模糊匹配避免大面积空洞哑光表面设uniquenessRatio15严格过滤误匹配透明物体如玻璃设uniquenessRatio25因反射/折射导致多个伪匹配我们测车窗玻璃时uniquenessRatio15导致80%区域深度为0升至25后有效深度区域达65%虽仍有误差但可后续滤波。4.5speckleWindowSize与speckleRange对付“椒盐噪声”的手术刀SGBM输出的视差图常有孤立噪点specklespeckleWindowSize定义连通域大小speckleRange定义视差变化阈值speckleWindowSize200删除面积200像素的噪点连通域speckleRange2连通域内最大最小视差差2才视为有效关键技巧先用cv::morphologyEx()开运算去除小噪点再用speckle参数效果比单用speckle好3倍。代码cv::Mat disp; sgbm-compute(left_rect, right_rect, disp); cv::Mat kernel cv::Mat::ones(3, 3, CV_8U); cv::morphologyEx(disp, disp, cv::MORPH_OPEN, kernel); // 先开运算 disp.convertScaleAbs(disp, disp, 1.0/16); // 转换为实际视差值4.6preFilterCap与textureThreshold应对低纹理区域的预处理preFilterCap限制预滤波器的剪切幅度textureThreshold过滤低纹理区域preFilterCap63默认对高光区域过度压制导致细节丢失工业建议preFilterCap31textureThreshold100原理降低预滤波强度让SGBM自己处理纹理再用textureThreshold剔除纯色区域如金属平面实测引擎盖平面区域preFilterCap63时视差值全为0preFilterCap31后出现合理视差梯度配合textureThreshold100剔除纯色区深度图信噪比提升4.7dB。4.7 参数调试工作流用ROI快速验证别等整图跑完SGBM单帧耗时长调试时切忌全图运行。我们建立三级ROI验证法像素级取100x100区域cv::getTickCount()测耗时确保50ms对象级框选待测物体如螺栓只对该ROI运行SGBM场景级用cv::Rect限定整图有效区域如排除背景调试脚本自动记录每次参数组合的平均视差值视差标准差有效像素占比非零视差像素/总像素ROI内已知尺寸物体的测量误差提示保存每次调试的disp图和参数JSON文件用Python脚本批量分析。我们发现P1/P2比值在0.2~0.3时金属表面匹配稳定性最高这个规律在3个不同项目中复现。5. 深度图后处理为什么滤波后更模糊几何约束才是工业级精度的基石SGBM输出的视差图直接转深度图Z (f*B)/d后常出现“阶梯状”噪声、孔洞、边缘撕裂。传统中值滤波、高斯滤波会平滑真实边缘而工业检测要求亚毫米级精度。我们的方案是用相机几何模型构建物理约束把深度图当作待求解的优化变量而非图像像素。5.1 孔洞填充不用插值用极线约束搜索SGBM在低纹理区输出0视差传统用cv::inpaint()插值但会引入虚假深度。我们改用极线约束对每个孔洞像素p_left(x,y)计算其在右图的极线l_right沿l_right搜索视差非零点取最近邻3个点加权平均权重1/距离²确保空间连续性C实现要点cv::Vec3d line; // p_left对应的极线 cv::computeCorrespondEpilines(cv::Mat(1,1,CV_64FC2,point), 1, E, line); // 参数化极线x x0 t*dx, y y0 t*dy double x0 -line[2]/line[0], y0 0; // 与x轴交点 double dx line[1], dy -line[0]; // 方向向量 // 沿极线采样10个点找最近非零视差 for (int t -5; t 5; t) { double xp x0 t*dx, yp y0 t*dy; if (xp0 xpright_disp.cols yp0 ypright_disp.rows) { double disp_val right_disp.atshort(yp,xp); if (disp_val ! 0) candidates.push_back({disp_val, t*t}); } } // 加权平均 double weighted_sum 0, weight_sum 0; for (auto c : candidates) { double w 1.0/(c.dist*c.dist 1e-6); weighted_sum c.disp * w; weight_sum w; } filled_disp weighted_sum / weight_sum;实测汽车保险杠孔洞填充后边缘深度跳变0.1mm而inpaint()方案跳变达0.8mm。5.2 边缘保持滤波用双边滤波的变体但权重基于3D梯度标准双边滤波用像素距离和灰度差但深度图需考虑3D空间距离。我们定义新权重空间权重w_s exp(-||p_i - p_j||² / (2*σ_s²))深度权重w_d exp(-|Z_i - Z_j|² / (2*σ_d²))关键改进||p_i - p_j||是3D空间距离由像素坐标(u,v)和深度Z反算cv::Point3d world_i pixel2world(u_i, v_i, Z_i, K, R, t); // 相机模型反投影 cv::Point3d world_j pixel2world(u_j, v_j, Z_j, K, R, t); double dist3d norm(world_i - world_j);σ_s设为5像素对应0.5mmσ_d设为0.3mm。这样滤波后螺栓边缘深度保持锐利而平面区域噪声降低60%。5.3 几何一致性校验用平面拟合剔除离群点工业物体多为平面或圆柱面利用此先验知识对深度图中每个100x100窗口用RANSAC拟合平面Z a*u b*v c计算窗口内所有点到平面的距离剔除3σ的离群点重新拟合平面迭代2次代码核心std::vectorcv::Point3d points; for (int i y; i y100; i) for (int j x; j x100; j) { double Z depth_map.atfloat(i,j); if (Z 0) { cv::Point3d p pixel2world(j,i,Z,K,R,t); points.push_back(p); } } // RANSAC拟合平面 cv::Vec4d plane; cv::fitPlane(points, plane); // 自定义函数返回axbyczd0 // 计算距离并剔除 std::vectorint inliers; for (size_t k 0; k points.size(); k) { double dist fabs(plane[0]*points[k].x plane[1]*points[k].y plane[2]*points[k].z plane[3]) / sqrt(plane[0]*plane[0]plane[1]*plane[1]plane[2]*plane[2]); if (dist 0.0005) // 0.5mm阈值 inliers.push_back(k); }对汽车门板平面区域此步骤剔除92%的离群点深度标准差从1.2mm降至0.18mm。5.4 尺寸测量不是读取深度值而是拟合几何体最终目标是测量尺寸如孔径、高度直接读取深度图像素值误差大。正确流程分割用cv::threshold()或cv::watershed()分离目标物体拟合对分割区域点云用cv::fitEllipse()拟合椭圆孔或cv::fitLine()拟合直线边缘反算将拟合参数椭圆中心、长短轴反投影到3D空间计算真实尺寸例如测圆孔直径// 获取孔区域点云 std::vectorcv::Point3d hole_points; for each pixel in hole_mask: hole_points.push_back(pixel2world(u,v,Z,K,R,t)); // PCA主成分分析求法向量 cv::PCA pca(hole_points, cv::Mat(), CV_PCA_DATA_AS_ROW); cv::Vec3d normal pca.eigenvectors.row(2); // 最小特征值对应法向 // 投影到垂直平面拟合圆 cv::Mat proj_points(2, hole_points.size(), CV_64F); for (size_t i0; ihole_points.size(); i) { cv::Point3d p hole_points[i]; // 投影到法向垂直平面 double d p.dot(normal); cv::Point3d p_proj p - d*normal; proj_points.atdouble(0,i) p_proj.x; proj_points.atdouble(1,i) p_proj.y; } cv::Point2d center; double radius; cv::minEnclosingCircle(proj_points.t(), center, radius); // 真实直径 2 * radius实测用此法测Φ12.00mm标准孔结果12.02±0.03mm直接读深度图像素值结果11.87±0.21mm。5.5 实时性能优化从2.3s到85ms的关键改造原始SGBM在i7-8700K上耗时2.3s/帧无法用于产线。我们通过四级优化达成85ms算法级用cv::StereoBinaryBM替代SGBM精度略降但满足±0.5mm要求耗时降至320ms内存级预分配cv::Mat内存避免频繁malloc15ms并行级用OpenMP并行化SGBM的compute()循环40ms4核硬件级将cv::Mat数据类型从CV_16S改为CV_8U视差缩放后28ms最终85ms/帧满足30fps实时要求。关键代码#pragma omp parallel for for (int y 0; y height; y) { // SGBM逐行计算 } // 内存池管理 static cv::Mat disp_buffer; if (disp_buffer.empty() || disp_buffer.size() ! size) { disp_buffer cv::Mat::zeros(size, CV_8U); } sgbm-compute(left_rect, right_rect, disp_buffer);经验不要迷信“必须用SGBM”在精度要求允许时StereoBM的确定性比SGBM的鲁棒性更重要。我们某产线检测Φ20mm孔StereoBM标准差0.41mm完全满足要求且无SGBM的随机性抖动。6. 工程部署VSCodeCMake的零调试陷阱以及Linux下OpenCV的ABI兼容性雷区写完算法只是开始C工程部署才是工业项目的真正门槛。我们曾因VSCode的tasks.json配置错误导致Debug模式下OpenCV链接了Release版库出现cv::Mat析构崩溃也因Ubuntu 20.04升级OpenCV 4.5.5后原有二进制程序因ABI不兼容直接段错误。以下是最痛的五个部署经验。6.1 VSCode C配置c_cpp_properties.json的三个致命字段VSCode的IntelliSense和调试依赖此文件错误配置导致includePath漏掉OpenCV头文件路径 →#include opencv2/opencv.hpp报红browse.path未包含OpenCV源码 → 无法跳转到cv::stereoRectify实现compilerPath指向/usr/bin/gcc而非/usr/bin/g→ C11特性编译失败正确配置Ubuntu 20.04 OpenCV 4.5.5{ configurations: [ { name: Linux, includePath: [ ${workspaceFolder}/**, /usr/include/opencv4/**, // 关键OpenCV4头文件在此 /usr/include/eigen3/** ], defines: [], compilerPath: /usr/bin/g, // 必须是g cStandard: c11, cppStandard: c17, intelliSenseMode: gcc-x64, browse: { path: [ ${workspaceFolder}, /usr/include/opencv4, /usr/include/eigen3 ], limitSymbolsToIncludedHeaders: false, databaseFilename: } } ], version: 4 }验证方法按CtrlClick能跳转到cv::Mat定义且终端g --version显示7.5.0。6.2 CMakeLists.txt静态链接还是动态链接选错等于放弃跨平台动态链接默认target_link_libraries(stereo_app ${OpenCV_LIBS})程序体积小但需目标机安装相同OpenCV版本静态链接推荐工业部署set(OPENCV_STATIC ON)生成单一可执行文件但体积增大12MB关键陷阱OpenCV静态库依赖libpng、libjpeg等若未一并静态链接运行时报libpng.so.16: cannot open shared object file。正确写法find_package(OpenCV REQUIRED) set(OPENCV_STATIC ON) find_package(OpenCV REQUIRED) # 强制静态链接所有依赖 set(CMAKE_FIND_LIBRARY_SUFFIXES .a${CMAKE_FIND_LIBRARY_SUFFIXES}) find_package(PNG REQUIRED) find_package(JPEG REQUIRED) target_link_libraries(stereo_app ${OpenCV_LIBS} ${PNG_LIBRAR p a hrefhttps://download.csdn.net/download/2501_91537435/92409420 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻