找到两条线之间的距离(OpenCV)

时间:2013-11-13 13:23:14

标签: opencv

经过一些转换后,我有以下图片。

如何找到这两条线之间的距离?

enter image description here

3 个答案:

答案 0 :(得分:2)

这样做的简单方法是   - 扫描一行直到找到高于阈值的像素。   - 继续扫描,直至找到低于阈值的像素。   - 计算像素,直到高于阈值的下一个像素。   - 获取从图像(或所有行)中采样的多行的平均值   - 您需要知道图像分辨率(例如每英寸dpos)才能将计数转换为实际距离

可以在the OpenCV documentation

中找到跨行扫描的有效方法

更复杂的方法是使用Houghlines来提取线条。它会在每一行给你两点(希望你只有两个)。由此可以计算出距离公式,假设线是平行的。

答案 1 :(得分:0)

骨架代码(效率不高,只是可读,以便您知道如何操作),

cv::Mat source = cv::imread("source.jpg", CV_LOAD_IMAGE_GRAYSCALE);
std::vector<int> output;
int threshold = 35, temp_var; // Change in accordance with data
int DPI = 30; // Digital Pixels per Inch

for (int i=0; i<source.cols; ++i)
{
    for (int j=0; j<source.rows; ++j)
    {
        if (source.at<unsigned char>(i,j) > threshold)
        {
            temp_var = j;
            for (; j<source.rows; ++j)
                if (source.at<unsigned char>(i,j) > threshold)
                    output.push_back( (j-temp_var)/DPI ); // Results are stored in Inch
        }
    }
}

之后,您可以对output等中的所有元素进行平均分析。

HTH

答案 2 :(得分:0)

<强>假设:

  • 你只有两条连续线,两者之间没有任何间断。
  • 除了行
  • 之外没有其他像素(噪音)

我建议的解决方案:与上面给出的几乎相同

  • 将最左边的行标记为第1行。将最右边的行标记为第2行。
  • 从最左边的列扫描图像(OpenCV中的Mat)并制作与第1行的像素值匹配的点列表
  • 从最右边的列扫描图像(OpenCV中的Mat)并制作与第2行的像素值匹配的点列表

使用以下代码计算该列表中各点之间的距离。

public double euclideanDistance(Point a, Point b){
    double distance = 0.0;
    try{
        if(a != null && b != null){
            double xDiff = a.x - b.x;
            double yDiff = a.y - b.y;
            distance = Math.sqrt(Math.pow(xDiff,2) + Math.pow(yDiff, 2));
        }
    }catch(Exception e){
        System.err.println("Something went wrong in euclideanDistance function in "+Utility.class+" "+e.getMessage());
    }
    return distance;
}