Ich habe ein Bild (.jpg Bild), und ich möchte den Hintergrund aus dem Originalbild extrahieren. Ich habe viel gegooglet, aber habe nur Tutorials gefunden, um das Vordergrundbild zu extrahieren.Hintergrund mit GrabCut extrahieren
Ich habe den Code von einem anderen stackoverflow question genommen. Der Code funktioniert gut für mich, und ich habe erfolgreich den Vordergrund extrahiert (gemäß meinen Anforderungen). Jetzt möchte ich diesen Vordergrund vollständig aus dem Originalbild entfernen. Ich mag es so etwas sein: -
Hintergrund = Originalbild - Vordergrund
Der leere Raum kann mit schwarzer oder weißer Farbe gefüllt werden. Wie kann ich das erreichen?
Ich habe mit dieser Technik versucht: -
Mat background = image2 - foreground;
aber es gibt ein komplettes schwarzes Bild.
Code: -
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// Open another image
Mat image;
image= cv::imread("images/abc.jpg");
Mat image2 = image.clone();
// define bounding rectangle
cv::Rect rectangle(40,90,image.cols-80,image.rows-170);
cv::Mat result; // segmentation result (4 possible values)
cv::Mat bgModel,fgModel; // the models (internally used)
// GrabCut segmentation
cv::grabCut(image, // input image
result, // segmentation result
rectangle,// rectangle containing foreground
bgModel,fgModel, // models
1, // number of iterations
cv::GC_INIT_WITH_RECT); // use rectangle
cout << "oks pa dito" <<endl;
// Get the pixels marked as likely foreground
cv::compare(result,cv::GC_PR_FGD,result,cv::CMP_EQ);
// Generate output image
cv::Mat foreground(image.size(),CV_8UC3,cv::Scalar(255,255,255));
//cv::Mat background(image.size(),CV_8UC3,cv::Scalar(255,255,255));
image.copyTo(foreground,result); // bg pixels not copied
// draw rectangle on original image
cv::rectangle(image, rectangle, cv::Scalar(255,255,255),1);
imwrite("img_1.jpg",image);
imwrite("Foreground.jpg",foreground);
Mat background = image2 - foreground;
imwrite("Background.jpg",background);
return 0;
}
Hinweis: Ich bin ein opencv Anfänger und nicht viel Kenntnis davon haben jetzt. Ich werde Ihnen sehr dankbar sein, wenn Sie entweder den vollständigen Code (wie von mir gefordert) posten oder einfach die Codezeilen posten und mir sagen können, wo diese Codezeilen platziert werden. Vielen Dank.
P.S. Dies ist meine zweite Frage bei StackOverflow.com. Entschuldigung ... wenn keine Konvention eingehalten wird.
Sie haben es genagelt. Danke :-) –