gpt4 book ai didi

opencv - 在一张纸上提取一个对象

转载 作者:太空宇宙 更新时间:2023-11-03 20:59:16 24 4
gpt4 key购买 nike

我被要求从一张纸上的工具图片中找到它们的轮廓轮廓以对其进行矢量化。

我完全是计算机视觉相关问题的初学者,我唯一想到的就是 OpenCV 和边缘检测。

结果比我想象的要好,这个还是很不靠谱,尤其是源图不“完美”的情况下。

我为他们给我的 Spanner 拍了 2 张照片。

玩完opencv bindings for node ,我明白了:

good wrench contour

然后,我尝试了不太好的图片:

enter image description here

那是完全无法利用的。通过更改 Canny 阈值,我可以获得更好的效果,但这必须自动化(假设图片相对正确)。

所以我有几个问题:

  • 我采取的方法是否正确? GrabCut 对此更好吗? Grabcut 和 Canny 边缘检测的组合?最后我仍然需要顶点,但我觉得 GrabCut 也能满足我的要求。
  • 边框粗糙,有一定误差。我可以增加 approxPolyDP 的乘数,但不会损失好的部分的精度。
  • 与上述观点相关,我正在考虑集成 Savitzky-Golay 算法来平滑轮廓,而不是使用 approxPolyDP 进行多边形简化。这是个好主意吗?
  • 通常,外边框线必须形成一个简单的、可切割的 block 。在 OpenCL 中有没有办法避免这条线做不可能的事情,比如传递自己? - 或者,简单地说,检测问题?这些配置当然是不可能的,但会在检测失败时发生(如第二张图)。
  • 我正在寻找一种自动执行 Canny 阈值计算的方法,因为我必须为每个图像手动调整它。你有这方面的好例子吗?
  • 我注意到在边缘检测之前将图像转换为灰度有时会使结果变差,有时会使结果变得更好。我应该选择哪一个? (顺便说一句,工具可以是任何颜色!)

这是我测试的源代码:

const cv = require('opencv');

const lowThresh = 90;
const highThresh = 90;
const nIters = 1;

const GRAY = [120, 120, 120];
const WHITE = [255, 255, 255];

cv.readImage('./files/viv1.jpg', function(err, im) {
if (err) throw err;

width = im.width()
height = im.height()
if (width < 1 || height < 1) throw new Error('Image has no size');

const out = new cv.Matrix(height, width);
im.convertGrayscale();
im_canny = im.copy();
im_canny.canny(lowThresh, highThresh);
im_canny.dilate(nIters);

contours = im_canny.findContours();

let maxArea = 0;
let biggestContour;

for (i = 0; i < contours.size(); i++) {
const area = contours.area(i);
if (area > maxArea) {
maxArea = area;
biggestContour = i;
}

out.drawContour(contours, i, GRAY);
}

const arcLength = contours.arcLength(biggestContour, true);
contours.approxPolyDP(biggestContour, 0.001 * arcLength, true);

out.drawContour(contours, biggestContour, WHITE, 5);

out.save('./tmp/out.png');
console.log('Image saved to ./tmp/out.png');
});

最佳答案

您需要添加一些预处理来清理图像。由于阴影、光线不足、工具上的高亮度等原因,图像的强度变化很大,因此您应该对图像进行均衡。这将帮助您在当前光线较暗或亮度较高的区域获得更好的响应。

这是一个关于 C++ 直方图均衡化的 opencv 教程:http://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.html

希望对你有帮助

编辑:你可以有一个基于一些损失函数(?)的自动阈值。例如:如果您知道该工具将完全捕获在框架中,您就知道您应该在从 x = 10 到 x = 800(比方说)的每一列中获得一个高值。然后,您可以继续降低阈值,直到从 x = 10 到 x = 800 的每一列都获得高值。这是一种非常幼稚的做法,但我认为这是一个有趣的实验,因为您正在生成图像自己并控制对象放置。

关于opencv - 在一张纸上提取一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44806723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com