Point aim_top = Point(420, 210); Point aim_bottom = Point(290, 170); //for (int i = top_Left2.y; i < bottom_Right2.y; i++) for (int i = 170; i < 210; i++) { for (int j = 290; j < 420; j++) //for (int j = top_Left2.x; j < bottom_Right2.x; j++) { if (roiimg2.at<uchar>(i, j) == 255) { if (i < aim_top.y) { aim_top.y = i; } if (j < aim_top.x) { aim_top.x = j; } if (i > aim_bottom.y) { aim_bottom.y = i; } if (j > aim_bottom.x) { aim_bottom.x = j; } } } } cout << "top点:" << aim_top.x << " , " << aim_top.y<<endl; cout << "bottom点:" << aim_bottom.x << " , " << aim_bottom.y << endl; int xl_2D_Point =abs( aim_top.y - aim_bottom.y) / (aim_top.x - aim_bottom.x); cout << "2D斜率:---" << xl_2D_Point << endl;帮我优化下这段代码
时间: 2024-03-25 08:35:49 浏览: 54
这段代码中的两个for循环可以使用OpenCV提供的函数来代替,可以大大提高代码的效率。同时,变量名的命名和代码的注释也可以更加清晰明了。
下面是优化后的代码:
```c++
Point aim_top(420, 210);
Point aim_bottom(290, 170);
cv::Rect roi_rect(290, 170, 130, 40);
cv::Mat roi_img = roiimg2(roi_rect);
cv::Point min_loc, max_loc;
cv::minMaxLoc(roi_img, NULL, NULL, &min_loc, &max_loc);
aim_top.x = roi_rect.x + min_loc.x;
aim_top.y = roi_rect.y + min_loc.y;
aim_bottom.x = roi_rect.x + max_loc.x;
aim_bottom.y = roi_rect.y + max_loc.y;
cout << "top点:" << aim_top.x << " , " << aim_top.y << endl;
cout << "bottom点:" << aim_bottom.x << " , " << aim_bottom.y << endl;
int xl_2D_Point = abs(aim_top.y - aim_bottom.y) / (aim_top.x - aim_bottom.x);
cout << "2D斜率:---" << xl_2D_Point << endl;
```
优化后的代码使用`cv::Rect`来定义ROI区域,使用`cv::Mat`来获取ROI图像。然后使用`cv::minMaxLoc`函数来获取ROI图像中的最小值和最大值的位置,从而得到aim_top和aim_bottom的坐标。这种方法比使用双重循环要快得多。
阅读全文