ROI2

#include “binary.hpp”
#include

void testROI(string fname)
{
stringstream ss;
int lx, ly, rx, ry;
Mat img=imread(fname);
int x1 = fname.rfind(’(’);
string s12 = fname.substr(x1 + 1, 2);
string s34 = fname.substr(x1 + 3, 2);
string s56 = fname.substr(x1 + 5, 2);
string s78 = fname.substr(x1 + 7, 2);
ss << s12;
ss >> lx;
ss.clear();
ss << s34;
ss >> ly;
ss.clear();
ss << s56;
ss >> rx;
ss.clear();
ss << s78;
ss >> ry;
ss.clear();
cout << lx << endl << ly << endl << rx << endl << ry << endl;
lx = lximg.cols/100;
ly = ly
img.rows/100;
rx = rx * img.cols/100;
ry = ry * img.rows/100;
cout << lx << endl << ly << endl << rx<< endl << ry << endl;
Rect roi(lx,ly,rx-lx,ry-ly);
Mat img1(img, roi);
imwrite(“ROI.png”, img1);
}

int main(int argc, char **argv)
{
if (argc < 3) return 0;
string s = argv[1];
string s1 = argv[2];
if (s == “ROI”)
{
testROI(s1);
}
return 0;
}

1.使用命令行参数,在project的project properties中可以添加命令行参数,空格后可以增加。
2.使用sstream库中的stringstream可以将string类型变为int类型
stringstream ss;
string s=“55”;
int x;
ss<<s;
ss>>x; /x=55/
3.string类中的rfind()函数可以找到字符串中的某个字符的位置,返回该字符的位置,返回类型为int。

<think>嗯,用户这次给出了另一段Pyclipper的代码,询问关于pc2的创建和执行差集操作的详细情况。我需要先理解这段代码的具体步骤,以及用户可能的疑问点。 首先,用户之前已经问过关于Execute方法使用CT_DIFFERENCE的问题,现在这段代码看起来是另一个例子,但参数更多,比如用了PFT_NONZERO两次。可能用户对这两个参数的作用不太清楚,或者想确认代码的正确性。 代码中的pc2是一个新的Pyclipper实例,然后添加了roi1作为裁剪路径(PT_CLIP),roi2作为主体路径(PT_SUBJECT)。然后执行差集操作,结果赋值给result[i][0]。这里需要注意参数的顺序,AddPath的时候是先添加Clip还是Subject,可能会影响结果。 用户可能想知道为什么这里用了两次PFT_NONZERO,或者这两个参数分别代表什么。Pyclipper的Execute方法有参数fillType,分别是subjectFillType和clipFillType,默认都是PFT_EVEN_ODD。用户这里显式设置为PFT_NONZERO,可能是有特定的填充规则需求。 另外,用户可能对路径的添加顺序有疑问,比如为什么roi1是PT_CLIP而roi2是PT_SUBJECT。需要解释清楚主体和裁剪对象的关系,以及差集操作的结果是从subject中减去clip的部分。 还有,结果处理部分,result[i][0]可能是一个多维数组,用户需要确保正确存储结果。另外,是否缩放坐标的问题也可能影响结果,用户之前的例子提到了缩放,但这里没有,可能需要提醒注意坐标是否整数。 可能用户在实际应用中遇到了问题,比如结果不符合预期,或者填充方式不正确。需要强调填充类型的重要性,以及如何根据多边形的方向选择合适的填充规则。 总结下来,回答的结构应该包括代码分步解析、参数详解、填充类型说明、注意事项等部分。同时,要指出用户代码中可能的问题,比如路径方向是否正确,是否需要缩放,以及填充类型的选择是否正确。</think>以下是对这段 Pyclipper 代码的逐行解析,重点关注参数细节和执行逻辑: --- ### **代码分步解析** #### 1. 创建 Pyclipper 对象 ```python pc2 = pyclipper.Pyclipper() ``` - 初始化一个空的操作容器,准备进行多边形布尔运算 #### 2. 添加路径参数 ```python pc2.AddPath(roi1, pyclipper.PT_CLIP, True) # 将 roi1 设为裁剪区域 pc2.AddPath(roi2, pyclipper.PT_SUBJECT, True) # 将 roi2 设为被裁剪对象 ``` - **roi1** 作为裁剪工具(剪刀) - **roi2** 作为被裁剪对象(纸张) - `closed=True` 表示路径是闭合多边形 #### 3. 执行差集运算 ```python result[i][0] = pc2.Execute( pyclipper.CT_DIFFERENCE, # 运算类型:差集 pyclipper.PFT_NONZERO, # 主体填充规则 pyclipper.PFT_NONZERO # 裁剪区域填充规则 ) ``` - 数学表达: $$结果 = roi2 - (roi1 \cap roi2)$$ --- ### **关键参数详解** | 参数 | 类型 | 作用 | |------|------|------| | `CT_DIFFERENCE` | 操作类型 | 从主体路径中**减去**与裁剪路径重叠的区域 | | `PFT_NONZERO` | 填充规则 | 通过路径缠绕方向判断内外区域(更符合直觉) | | `PFT_EVEN_ODD` (默认) | 填充规则 | 奇偶交叉计数法判断内外区域 | --- ### **填充规则对比** #### 1. 非零规则 (`PFT_NONZERO`) - 路径顺时针绘制:+1 - 路径逆时针绘制:-1 - **最终值 ≠ 0** 的区域被填充 ![非零规则示意图](https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Nonzero_rule.svg/240px-Nonzero_rule.svg.png) #### 2. 奇偶规则 (`PFT_EVEN_ODD`) - 统计射线穿过的路径次数 - **奇数次**交叉的区域被填充 ![奇偶规则示意图](https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Even-odd_rule.svg/240px-Even-odd_rule.svg.png) --- ### **典型问题排查** 1. **路径方向错误** - 检查 `roi1` 和 `roi2` 的顶点顺序是否符合预期方向(建议统一使用顺时针) 2. **未处理浮点数** - Pyclipper 要求整数坐标,需对浮点坐标进行缩放: ```python scale_factor = 1000 scaled_roi = [(int(x*scale_factor), int(y*scale_factor)) for (x,y) in roi] ``` 3. **结果为空列表** - 检查两个多边形是否有实际交集 - 尝试交换 `PT_CLIP` 和 `PT_SUBJECT` 的顺序 --- ### **应用场景示例** 假设需要从地图区域 `roi2` 中剔除禁止通行的区域 `roi1`,该代码将生成可供导航的有效区域路径。这在机器人路径规划、GIS 地理围栏等领域非常常见。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值