c++ - 如果邻居具有特定值,OpenCV C++ 获取特定值像素的最快方法
问题描述
cv::Mat extract_relevant_outline(cv::Mat img) {
std::vector<cv::Point > interesting;
cv::Mat new_plot;
new_plot = cv::Mat::zeros(img.rows, img.cols, CV_8UC1);
int center_val = 255;
int neighbor_val = 200;
std::vector<cv::Point> dirs = { {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1} };
for (int y = 1; y < (img.cols - 1); y++) {
for (int x = 1; x < (img.rows - 1); x++) {
if (img.at<uchar>(x, y) == center_val) {
bool found_neighbour = false;
for (int i = 0; i < dirs.size(); i++) {
if (img.at<uchar>(x + dirs[i].x, y + dirs[i].y) == neighbor_val) {
found_neighbour = true;
break;
}
}
if (found_neighbour) {
interesting.push_back({ x,y });
new_plot.at<uchar>(x, y) = 254;
}
}
}
}
给定一个单通道 cv::Mat,我想找到所有值为 255、至少有一个值为 200 的直接邻居的像素。将它们存储在 cv::Points 数组中并绘制在新图像中。
我是 C++ 新手,在 Python 中会使用 skimage 来实现这一点。
上面的代码似乎给出了我想要的结果,但我知道它效率低下。我正在迭代源图像中的每个像素,并在检查邻居之前首先测试“center_val”,我怀疑至少,我应该能够只迭代匹配“center_val”的像素,但函数如 cv::inRange (我怀疑可能更快)似乎返回另一个 cv::Mat 而不是我可以迭代的更短的东西,所以我对如何优化它感到困惑。有任何想法吗 ?
解决方案
推荐阅读
- python - 列表理解而不是嵌套的 for 循环
- monitoring - 如何显示前 K 个节点 wrt CPU 使用率?
- git - 使用 Github Actions 持续部署到 Heroku
- html - Gatsby 按钮 onClick 使用链接功能
- java - 将 onItemClickListener 放在 AutoCompleteTextView 下拉列表中并通过获取位置传递意图但失败
- javascript - Oribt 控件不起作用,鼠标无法移动场景
- android-popupwindow - 在另一个视图下方显示 Android 弹出窗口
- c# - WPF DataGrid 标题文本背景填充
- javascript - JSON.filter(...).then 不是函数(Javascript)
- reactjs - Material UI Switch 切换有错误并且不能正确更改