创建多线程加速处理这一段for循环Extract1DEdgeCircle Extract1DEdgeCircle;int m = m_vpdEquinoxPoints.size();vector<Edge1D_Result>edges;for (int i = 0; i < m; i++) { edges = Extract1DEdgeCircle.Get1DEdge(RoiMat, m_vpdEquinoxPoints[i], m_dMeasureLength, m_dMeasureHeight, m_vdMeasureAngle[i] , m_dSigma, m_nThresholdCircle, m_nTranslationCircle == 1 ? Translation::Poisitive : Translation::Negative, Selection::Strongest); for (int i = 0; i < edges.size(); i++) { m_vpdEdgePoints.push_back(edges[i].m_pdEdgePoint); m_vdEdgeGradient.push_back(edges[i].m_dGradient); } }并且使变量不冲突
时间: 2023-12-14 22:37:11 浏览: 45
图像处理中使用多线程及图像分块实现加速运算
5星 · 资源好评率100%
可以使用C++11中的std::thread来实现多线程加速处理。具体实现如下:
```cpp
Extract1DEdgeCircle Extract1DEdgeCircle;
int m = m_vpdEquinoxPoints.size();
vector<vector<Edge1D_Result>> allEdges(m); // 每个线程处理的结果存在二维向量中
vector<thread> threads(m); // 创建线程
for (int i = 0; i < m; i++) {
threads[i] = thread([&](int idx) { // 使用lambda表达式创建线程
allEdges[idx] = Extract1DEdgeCircle.Get1DEdge(RoiMat, m_vpdEquinoxPoints[idx], m_dMeasureLength, m_dMeasureHeight, m_vdMeasureAngle[idx], m_dSigma, m_nThresholdCircle, m_nTranslationCircle == 1 ? Translation::Poisitive : Translation::Negative, Selection::Strongest);
}, i);
}
for (int i = 0; i < m; i++) {
threads[i].join(); // 等待所有线程执行完毕
}
// 将每个线程处理的结果合并到一起
for (int i = 0; i < m; i++) {
for (int j = 0; j < allEdges[i].size(); j++) {
m_vpdEdgePoints.push_back(allEdges[i][j].m_pdEdgePoint);
m_vdEdgeGradient.push_back(allEdges[i][j].m_dGradient);
}
}
```
在上面的代码中,我们首先创建了一个二维向量`allEdges`,用于存储每个线程处理的结果。然后创建了`m`个线程,每个线程处理一部分数据,并将结果存储到`allEdges`对应的位置上。最后将所有线程处理的结果合并到一起。
注意,在lambda表达式中,我们使用了`&`来捕获外部所有变量的引用,这样在lambda表达式中就可以直接访问外部的变量了。另外,在lambda表达式中,我们使用了`idx`变量来表示当前线程处理的数据的下标,这样不同线程之间就不会冲突了。
阅读全文