Tôi có hình ảnh (hình ảnh .jpg) và tôi muốn trích xuất nền từ hình ảnh gốc. Tôi đã googled rất nhiều nhưng chỉ tìm thấy hướng dẫn của giải nén hình ảnh tiền cảnh.Trích xuất ảnh nền bằng GrabCut
Tôi đã lấy mã từ một số khác stackoverflow question. Mã này làm việc tốt cho tôi, và tôi đã trích xuất thành công nền trước (theo yêu cầu của tôi). Bây giờ tôi muốn loại bỏ hoàn toàn tiền cảnh này khỏi ảnh gốc. Tôi muốn nó được một cái gì đó như thế này: -
Background = Original Image - Foreground
Các không gian trống rỗng có thể được lấp đầy với màu đen hoặc trắng. Làm thế nào tôi có thể đạt được điều này?
Tôi đã cố gắng sử dụng kỹ thuật này: -
Mat background = image2 - foreground;
nhưng nó mang lại một hình ảnh màu đen hoàn toàn.
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;
}
Lưu ý: Tôi là một người mới bắt đầu opencv và không có nhiều kiến thức về nó ngay bây giờ. Tôi sẽ rất biết ơn bạn nếu bạn có thể đăng mã hoàn chỉnh (theo yêu cầu của tôi) hoặc chỉ đăng các dòng mã và cho tôi biết vị trí của các dòng mã này. Cảm ơn.
P.S. Đây là câu hỏi thứ hai của tôi tại StackOverflow.com. xin lỗi ... nếu không theo bất kỳ quy ước nào.
Bạn đã đóng đinh nó. Cảm ơn :-) –