经过一些转换后,我有以下图片。
如何找到这两条线之间的距离?
答案 0 :(得分:2)
这样做的简单方法是 - 扫描一行直到找到高于阈值的像素。 - 继续扫描,直至找到低于阈值的像素。 - 计算像素,直到高于阈值的下一个像素。 - 获取从图像(或所有行)中采样的多行的平均值 - 您需要知道图像分辨率(例如每英寸dpos)才能将计数转换为实际距离
中找到跨行扫描的有效方法更复杂的方法是使用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)
<强>假设:强>
我建议的解决方案:与上面给出的几乎相同
使用以下代码计算该列表中各点之间的距离。
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;
}