- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我被要求从一张纸上的工具图片中找到它们的轮廓轮廓以对其进行矢量化。
我完全是计算机视觉相关问题的初学者,我唯一想到的就是 OpenCV 和边缘检测。
结果比我想象的要好,这个还是很不靠谱,尤其是源图不“完美”的情况下。
我为他们给我的 Spanner 拍了 2 张照片。
玩完opencv bindings for node ,我明白了:
然后,我尝试了不太好的图片:
那是完全无法利用的。通过更改 Canny 阈值,我可以获得更好的效果,但这必须自动化(假设图片相对正确)。
所以我有几个问题:
approxPolyDP
的乘数,但不会损失好的部分的精度。approxPolyDP
进行多边形简化。这是个好主意吗?这是我测试的源代码:
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/
我试图学习python并以此开始,当我尝试运行它时,我一直收到语法错误。光标跳到def start部分的close结束处。我不确定语法错误来自哪里,因为我用语音标记了所有打印件 #! python3
在我的应用程序中,我使用了 polymer 的 paper-dialog 元素。对话框的样式总是将它定位在中心,但我希望它在对话框和窗口右侧之间设置一个最小距离,所以当窗口缩小时,纸质对话框不会靠近右
我需要实现一个石头剪刀布锦标赛模拟器,它将玩完所有回合并返回锦标赛。 这是我的锦标赛数组: tournament = [ [ [ ["Armando",
所以我实际上是用自定义元素包装标准 paper-slider 元素,并希望包含一些样式。以下是我目前拥有的: /* Works */ paper-slider {
对于仅包含图像的 HTML 文档,如何缩放图像以填满整个工作表?我希望图像缩放它的宽度/高度以尽可能大/尽可能小以适合一张纸。 我开始用它来分页 footer {page-break-after:al
我正在尝试扩展 Polymer paper-slider 元素,以便能够获取枚举列表并在 slider 中迭代这些值,而不是仅显示数值。但是我在使样式起作用时遇到了麻烦。如您所见,如果您运行此代码片段
我是 paper.js 的新手。 对于这个项目,我需要一个将在许多情况下使用的形状(具有不同的填充颜色),因此使用符号显然更好(而不是使用 Path.clone() 方法)。但是,一旦我将符号实例化为
我想重新组合我的 PDF 文档以使用我的打印机的 A4 格式在 A5 上打印它们。 我还需要在每个 A5 页面上打印两个站点(幻灯片),当然应该是双面的。因此 A4 页面是横向格式。比我想把它剪在中间
我有两个元素一个在另一个上面,也就是说,一个挡住了另一个。假设 Item2 被 Item1 阻止。现在每当我使用 project.hitTest(Item2); 它工作正常。 但是当我使用鼠标的eve
我有一个网站,它本质上是一个大 Canvas 图像。目前,当 body 被加载时,它开始通过这段代码淡入: 但是我想在我的 paperscript 中调用它,因为有时 body 会在图像从 pape
我是一名优秀的程序员,十分优秀!