OpenCv - 深度图

问题描述 投票:0回答:1

你好 Stackoverflowers,

我当前的任务包括确定金属坯料(原木)是否由一个或两个部分制成。我的第一次尝试是寻找一条黑色垂直线,表示两根原木之间的分隔。如果我找不到分离点,我就断定它是一个整体。

enter image description here

这个程序运行得完美无缺,直到......深色钢坯出现...... enter image description here

所以我决定使用另一个我知道永远正确的参数,即深度。坯料和间隙之间总是存在深度不同。

所以我决定尝试两个相机彼此平行安装,有人知道如何正确设置吗?

或者有人知道另一种方法来完成我的任务吗?

提前致谢!

opencv image-processing computer-vision camera image-segmentation
1个回答
0
投票

在我看来效果最好: 使用便宜的激光线(在工具/五金店大约 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 个摄像头时,它会很有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.