经过一些转换后,我得到了下图。
我怎样才能找到这两条线之间的距离?
一个简单的方法是 - 扫描一行,直到找到高于阈值的像素。- 继续扫描,直到找到低于阈值的像素。- 计算像素,直到高于阈值的下一个像素。- 取图像中采样的多行(或所有行)的平均值 - 您需要知道图像分辨率(例如每英寸 dpos)才能将计数转换为实际距离
在OpenCV 文档中可以找到一种有效的跨行扫描方法
更复杂的方法是使用Houghlines来提取线条。它会在每条线上给你两分(希望你只有两分)。假设线是平行的,由此可以计算出距离公式。
一个骨架代码(效率不高,只是可读,以便您知道如何去做)将是,
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
等中的所有元素取平均值。
高温高压
假设:
我提出的解决方案:与上面给出的几乎相同
使用下面的代码计算该列表中点之间的距离。
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;
}