0

经过一些转换后,我得到了下图。

我怎样才能找到这两条线之间的距离?

在此处输入图像描述

4

3 回答 3

2

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

在OpenCV 文档中可以找到一种有效的跨行扫描方法

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

于 2013-11-13T14:37:26.167 回答
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等中的所有元素取平均值。

高温高压

于 2013-11-13T17:36:46.783 回答
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;
}
于 2016-06-27T13:58:58.003 回答