cv::solveLP()为何强制x≥0?负解场景下如何使用该函数?
针对你的Delaunay三角剖分LP问题的解决方案&疑问解答
能不能用cv::solveLP()处理变量可取负值的场景?
可以,通过变量替换适配它的强制非负约束:
- 对每个可能取负值的坐标变量(比如
x_i、y_i),拆成两个非负变量的差:x_i = x_i_pos - x_i_neg,其中x_i_pos ≥ 0,x_i_neg ≥ 0;同理处理y分量。 - 将原线性规划问题的所有约束和目标函数,都替换为用
x_i_pos、x_i_neg这类非负变量表示的形式。 - 转换后的问题完全符合
cv::solveLP()的非负要求,能正常求解。
需要注意:变量替换会让总变量数翻倍,如果你的点数量很大,可能会降低求解效率,但常规规模的Delaunay剖分场景下,这个方案完全可行。
另外补充:你要最小化无穷范数的需求,本身可以转换成标准LP问题:引入一个非负变量t,把所有|(x_j - x_i) - dx_ij| ≤ t、|(y_j - y_i) - dy_ij| ≤ t的约束拆成线性不等式,然后以最小化t为目标,再结合上面的变量替换,就能用cv::solveLP()求解。
为什么cv::solveLP()不提供非负约束的开关?
OpenCV的cv::solveLP()不是通用线性规划库,它是针对计算机视觉领域的典型场景设计的——比如图像像素值优化、物体计数、资源分配这类问题,变量天然是非负的(像素亮度、物体数量不可能为负)。
把非负约束硬编码成默认项,是为了简化API设计,降低CV开发者的使用成本,同时减少库的维护复杂度。毕竟OpenCV的核心目标是服务计算机视觉任务,而非覆盖所有数学规划场景,所以不会为了小众需求添加开关选项。
内容的提问来源于stack exchange,提问作者Cooper Maira
相关产品推荐
相关产品推荐

