ツールの写真を用紙に貼り付けると、それらの輪郭の輪郭をベクトル化するよう求められます。用紙上にオブジェクトを抽出する
私はコンピュータビジョン関連の問題の初心者です。私が考えたのは、OpenCVとエッジ検出だけでした。
結果は私が想像していたより優れていますが、これはまだ非常に信頼性が低く、特にソース画像が「完璧」でない場合はそうです。
私は彼らが私に与えたレンチの2つの写真を撮った。
opencv bindings for nodeで遊んでた後、私はこの取得:次に
を、私はあまり良い絵で試してみた:完全inexploitableだ
を。 Canny thresoldを変更することで少し上手くいくことができますが、それは自動化する必要があります(写真が比較的正確であることが前提です)。
だから私はいくつかの質問持っている:
- 私は右のアプローチを取っていますか? GrabCutはこれに対してより良いですか? GrabcutとCannyのエッジ検出の組み合わせ?私はまだ最後に頂点が必要ですが、私はGrabCutも私が望むことをしていると感じます。
- 罫線が粗く、特定のエラーがあります。私は
approxPolyDP
の乗数を増やすことができますが、良い部分の精度が失われることはありません。 - 上記に関連して、
approxPolyDP
のポリゴン簡略化ではなく、輪郭を滑らかにするSavitzky-Golayアルゴリズムを統合しようと考えています。いいアイデアですか? - 通常、外側の境界線は、単純なカット可能なブロックを形成する必要があります。その行が不可能なことをするのを避けるために、OpenCLに方法がありますか? - あるいは、問題を検出するだけですか?これらの設定はもちろん不可能ですが、検出が失敗した場合に起こります(2番目の画像のように)。
- 私は手動で各画像を調整する必要があるので、私は自動Canny thresold計算を行う方法を探しています。あなたはそのための良い例がありますか?
- エッジ検出前に画像をグレースケールに変換すると、結果が悪くなることがあります。どちらを選ぶべきですか? (!ツールはところで、任意の色のものであってもよい)
ここに私のテストのためのソースです:
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');
});
不均一なバックグラウンド除去のアルゴリズムを確認してください。 –
@AnderBiguri GrabCutについてお話しますか?私はそれが答えかもしれないともっと考えています。 私はCannyベースのソリューションを使ってGrabCutのオブジェクト境界を判断すると思います。 GrabCutを適用すると、必要に応じて(マスキングを使用して)ユーザによる修正が可能になります。そしてGrabCutの出力から再びエッジを検出します(バックグラウンドが削除されるので、Googleでdetouredイメージを取るときのようにうまく動作します)。実行可能に見えます。 オブジェクトのスケールを決定するには、私はArukcoマーカーを使用すると思います。 –
このシステムはどのように動作するように意図されていますか?私はなぜマシンビジョンシステムの[照明は重要なコンポーネントです](http://www.ni.com/white-paper/6901/en/)と聞いていますが、画像には...まあ、そうではありません理想的に見える。最初の写真はかなりまともですが、中でも明るい円形のグラデーションが見えます。 2番目はかなりひどいです。もしあなたがそれを修正できれば、多くの作業や失敗の可能性をかなり省くことができます(実行可能であると仮定して)。 –