你好 Stackoverflowers,
我当前的任务包括确定金属坯料(原木)是否由一个或两个部分制成。我的第一次尝试是寻找一条黑色垂直线,表示两根原木之间的分隔。如果我找不到分离点,我就断定它是一个整体。
这个程序运行得完美无缺,直到......深色钢坯出现......
所以我决定使用另一个我知道永远正确的参数,即深度。坯料和间隙之间总是存在深度不同。
所以我决定尝试两个相机彼此平行安装,有人知道如何正确设置吗?
或者有人知道另一种方法来完成我的任务吗?
提前致谢!
在我看来效果最好: 使用便宜的激光线(在工具/五金店大约 20 美元),并搜索图像中的激光。如果线条贯穿整个坯料,那么它就是一件。如果生产线出现断裂或严重变形,则会出现 2 根钢坯。
我的想法:
glm::vec3 laserColor(1,0,0); //red
glm::vec3 currentColor;
float maximum_color_distance = 0.1;
for(int a = 0; a < image.rows;a++)
{
for(int b = 0; b < image.rows;b++)
{
currentColor = image.at(a,b);
float current_distance = glm::distance(laserColor, currentColor);
if(current_distance > maximum_color_distance)
{
image.at(a,b) = 0;
}
}
}
glm::vec2 leftPixel = getMostLeftLaserPixel(image);
glm::vec2 rightPixel = getMostRightLaserPixel(image);
Line line = calculateLine (leftPixel,rightPixel);
line.hasHoles(image, laserColor); //checks for 3x3 pxiel blocks which are on the line, returns false if all pixels in a 3x3 block have an other color then the laser. 3x3 to take small erros to serious
如果钢坯足够远,也许你可以在合适的距离使用kinect。立体图像在极线上使用大多数时间块匹配。这意味着取 3x3 像素,从左到右,并尝试找到看起来相似的 3x3 像素。使用金属可能会出现问题。首先你有重复的模式。其次,你有反射,每个相机的反射都会不同,因为它们的视角略有不同。
kinect 也可能会出现与金属反射率相同的问题,但不会出现重复图案:
“这取决于制作物体的材料。如果物体是由金属、玻璃或有光泽的物体制成的,深度相机将难以准确捕捉图像。”
OpenCV 提供了 rectifyStereoIamge (或类似的函数),当您使用 2 个摄像头时,它会很有帮助。