それで、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 は同じ出力を与えています。どんな助けでも大歓迎です。前もって感謝します!