1

それで、3日前にOpenCVを手に入れました。完全な初心者。Lazy Snapping を実装するコードをオンラインでダウンロードしました。Lazy Snapping は、Grabcut によく似た画像切り取りツールです。C++ プロジェクトかと思ったが、ほとんどのコードは C スタイルで書かれており、マスク作成部分まで完成している。元の画像にマスクを適用するように拡張し、前景を切り取って別の画像に貼り付けることを考えました。

C に関するヘルプはあまり見つかりませんでした。そのため、マスクを保存し、Mat (C++) を使用して読み取りました。ここに小さなコードスニペットがあります:

cvSaveImage("Mask.jpg",mask);
cvSaveImage("Object_Marking_Output.jpg",showImg);
cvSaveImage("Original.jpg",original);
Mat masky = imread("Lazy Snapping/mask.jpg", 1);
Mat showImg1 = imread("Lazy Snapping/Original.jpg", 1);     

Mat crop(showImg1.rows, showImg1.cols, CV_8UC3);
//Though the mask appears black and white I kept getting errors 
//This convert code helped it go away. I could recreate the error if necessary
cvtColor(masky,masky,CV_RGB2GRAY);
//I resize it because the mask created is smaller
cv::resize(masky, masky, showImg1.size());

showImg1.copyTo(crop, masky);
//bitwise_and(showImg1, cv::Scalar(255,255,255), crop, masky);

// normalize so imwrite(...)/imshow(...) shows the mask correctly!
normalize(masky.clone(), masky, 0.0, 255.0, CV_MINMAX, CV_8UC1);    

// show the images
imshow("Mask used to apply on image", masky);
imshow("Lazy snapped output", crop);

しかし、私の出力は非常に奇妙に見えます。他のすべてを背景として扱って、頭のタオルを取り除こうとしています。作成されたマスクは完璧で、タオルのみの輪郭が描かれています。ただし、入力画像に適用すると、出力画像に背景のこれらの余分な散乱ビットが表示されます(画像を直接投稿することはできません。ドロップボックスのリンクは次のとおりです)。

https://www.dropbox.com/sh/z4u22n9yyfhcnpx/AAA8QxU9tkLGgEEyS_2QFuG2a

フォーラムで読んでいるチュートリアルと回答から、正しい方法のように見えるため、なぜこれが起こっているのかわかりません。copyTo と bitwise_and は同じ出力を与えています。どんな助けでも大歓迎です。前もって感謝します!

4

1 に答える 1

2

これらの「穴」はすでにマスク img にあります (ピペット ツールを備えた imgviewer を使用している場合は、自分で確認できます。resp.parts は完全に黒ではなく、0x020202 のようであるため、その領域でマスキングが失敗します)

それで、

threshold(masky,masky, 120,255, 0);

あなたのイメージなので、完全に「バイナリ」です

PS .: そのようなものを jpg として保存しないでください。あなたの問題は圧縮/補間アーティファクトのようです

于 2014-05-29T07:53:52.457 に答える