Using openCV to overlay transparent image onto another image

后端 未结 6 2129
庸人自扰
庸人自扰 2020-12-01 12:18

How can I overlay a transparent PNG onto another image without loosing it\'s transparency using openCV in python?

import cv2

background = cv2.imread(\'field         


        
6条回答
  •  无人及你
    2020-12-01 12:25

    You need to open the transparent png image using the flag IMREAD_UNCHANGED

    Mat overlay = cv::imread("dice.png", IMREAD_UNCHANGED);
    

    Then split the channels, group the RGB and use the transparent channel as an mask, do like that:

    /**
     * @brief Draws a transparent image over a frame Mat.
     * 
     * @param frame the frame where the transparent image will be drawn
     * @param transp the Mat image with transparency, read from a PNG image, with the IMREAD_UNCHANGED flag
     * @param xPos x position of the frame image where the image will start.
     * @param yPos y position of the frame image where the image will start.
     */
    void drawTransparency(Mat frame, Mat transp, int xPos, int yPos) {
        Mat mask;
        vector layers;
    
        split(transp, layers); // seperate channels
        Mat rgb[3] = { layers[0],layers[1],layers[2] };
        mask = layers[3]; // png's alpha channel used as mask
        merge(rgb, 3, transp);  // put together the RGB channels, now transp insn't transparent 
        transp.copyTo(frame.rowRange(yPos, yPos + transp.rows).colRange(xPos, xPos + transp.cols), mask);
    }
    

    Can be called like that:

    drawTransparency(background, overlay, 10, 10);
    

提交回复
热议问题