【发布时间】:2017-08-07 21:41:52
【问题描述】:
在这种方法中,我想为cv::Mat 中的 each 列找到两个(相邻)点之间的最大距离。最后应该返回对应的点(彼此之间的距离最大)。
为了实现这一点,我已经研究了很多,现在我坚持使用这个代码 sn-p:
cv::Mat mat;
std::vector<cv::Point> pointVec, finalPointVec;
std::vector<float> allDist;
for (int i = 0; i < mat.rows; i++) {
for (int j = 0; j < mat.cols; j++) {
c = mat.col(j);
if (c.at<Vec3b>(i, j)[0] == 0
&& c.at<Vec3b>(i, j)[1] == 0
&& c.at<Vec3b>(i, j)[2] == 255) {
cv::Point diPoint(j, i);
pointVec.push_back(diPoint);
if (pointVec[j].x == pointVec[j + 1].x) {
//std::cout << pointVec[j].y << "\n";
float diffY = pointVec[j].y - pointVec[j + 1].y;
float diffX = pointVec[j].x - pointVec[j + 1].x;
float dist = sqrt((diffY * diffY) + (diffX * diffX));
for (int d = 0; d < pointVec[j].x; d++) {
allDist.push_back(dist);
}
}
}
}
所以我已经遍历了cv::Mat 并计算了距离。现在我想实现查找 each 列的最大距离。我在这里寻求您的帮助,我怎么能意识到这一点。虽然我认为if (pointVec[j].x == pointVec[j + 1].x) 应该可以找到相同的列,但它似乎是错误的实现。另外 - 我如何返回那些彼此距离最大的点?
也许我需要澄清一下,这里是一张图片,它应该是什么样子(圈出的点应该是那些,必须返回):
我很高兴任何答案!
【问题讨论】:
-
首先,遍历列。为清楚起见,我建议在该循环内调用类似“find_greatest_distance”的函数。该函数应该遍历列中的行,使用“foreach first point, foreach second point calculate distance and remember it if it is greater than the current remembered distance”的算法。
-
@PaulHicks 我实际上已经循环遍历列和行?或者你是什么意思?
-
您当前首先循环遍历行,然后遍历列。你需要反过来做。另外,您需要一个额外的循环:您需要在列循环内嵌套一个列循环。我建议使用函数,如果你在一个代码块中完成它会太混乱且难以理解。
-
你的意思是距离应该只在同一列中的点之间进行比较?
col[j]和col[j+1]是不同的列。 -
你必须重写条件,因为现在还不清楚你想要实现什么。您是要计算每列中所有点之间的距离,还是只计算特定列中彼此相邻的点对之间的距离?