2015-02-10 77 views
0

到目前为止,我已经设法使用蒙版并从第一个获得第二个图像。但我想要的是第二个图像中的黑色区域是透明的(即我试图获得的输出是第三个图像)。下面是目前的代码。请在这方面给我建议。获取蒙面区域是否透明?

编辑:第三个是从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); 

enter image description here

enter image description here

enter image description here

+0

您可以[混合](http://docs.opencv.org/doc/tutorials/core/adding_images/adding_images.html)在OpenCV中和使用权重两个图像,以使它透明。 – GPPK 2015-02-10 07:53:07

+0

@GPPK感谢您的回复。是。为此,我必须首先有一个透明的图像。在这里,我想要的是从第一个获得像第三个图像。混合可能吗?如果是的话,请你指出正确的方向。 – 2015-02-10 08:00:34

回答

1

这可以通过首先其阿尔法值设置为区域0来完成你希望使其完全透明(其他人为255),然后将其保存到PNG。

要集合像素(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); 
+0

谢谢。你能否多给我解释一下。我只是OpenCV的初学者。我如何将alpha值更改一次应用到某个区域?它是否以与掩蔽相同的方式完成? – 2015-02-10 11:40:23

+1

@RajindRuparathna检查更新的答案,以获得更简单的解决方案。 – herohuyongtao 2015-02-10 13:02:00