使蒙版区域透明?

Getting masked area to be transparent?

到目前为止,我已经设法使用遮罩并从第一张图片中获取第二张图片。但我想要的是第二张图片中的黑色区域是透明的(即我试图获得的输出是第三张图片)这是到目前为止的代码。请给我一些建议。

编辑:第三个来自 photoshop

    //imwrite parameters
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
compression_params.push_back(100);

//reading image to be masked
image = imread(main_img, -1);

//CV_LOAD_IMAGE_COLOR

namedWindow("output", WINDOW_NORMAL);
//imshow("output", image);

//Creating mask image with same size as original image
Mat mask(image.rows, image.cols, CV_8UC1, Scalar(0));


// Create Polygon from vertices
ROI_Vertices.push_back(Point2f(float(3112),float(58)));
ROI_Vertices.push_back(Point2f(float(3515),float(58)));
ROI_Vertices.push_back(Point2f(float(3515),float(1332)));
ROI_Vertices.push_back(Point2f(float(3112),float(958)));

approxPolyDP(ROI_Vertices, ROI_Poly, 1, true);

// Fill polygon white
fillConvexPoly(mask, &ROI_Poly[0] , ROI_Poly.size(), 255, 8, 0);                 

//imshow("output", mask);

// Create new image for result storage
imageDest = cvCreateMat(image.rows, image.cols, CV_8UC4);

// Cut out ROI and store it in imageDest
image.copyTo(imageDest, mask);

imwrite("masked.jpeg", imageDest, compression_params);
imshow("output", imageDest);

cvWaitKey(0);   

这可以通过首先将要使其完全透明的区域的 alpha 值设置为 0(其他区域为 255),然后将其保存为 PNG 来完成。

要设置pixel-(x,y)的alpha值,可以这样做:

image.at<cv::Vec4b>(y, x)[3] = 0;

PS:如果不是当前图像,需要先将其转换为4通道格式。例如:

cv::cvtColor(image, image, CV_BGR2BGRA);

更新:如果您已经计算了 ROI 区域的掩码,您可以简单地将它与原始图像(假设有 3 个通道)合并到得到最终结果。喜欢:

cv::Mat mask; // 0 for transparent regions, 255 otherwise (serve as the alpha channel)

std::vector<cv::Mat> channels;
cv::split(image, channels);

channels.push_back(mask);
cv::Mat result;
cv::merge(channels, result);