2015-02-10 82 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