使蒙版区域透明?
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);
到目前为止,我已经设法使用遮罩并从第一张图片中获取第二张图片。但我想要的是第二张图片中的黑色区域是透明的(即我试图获得的输出是第三张图片)这是到目前为止的代码。请给我一些建议。
编辑:第三个来自 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);