在OpenCV中绘制透明图像

时间:2014-04-17 10:06:53

标签: opencv png draw transparent

如果我在具有特定颜色的透明图像(4个通道)上绘制线条或某个图形,在保存图像后,线条/图形为白色,即使我用红色绘制并且我创建一个透明的图像或我从互联网上打开一个。我错过了一些东西。有什么建议吗?

原始图片 http://i.imgur.com/Bfy5tNq.png?1

用红色绘制2条线后的图片 http://i.imgur.com/Pl7BHPT.png?1

    Mat image;
    image = imread("ball.png", -1);

    if(image.channels() == 4)
    {
        //vector<Mat> ch;
        //split(image, ch);

        cv::line(image,cv::Point(0,0),cv::Point(image.cols,image.rows),CV_RGB(255,0,0),7,CV_AA,0);
        cv::line(image,cv::Point(0,image.rows),cv::Point(image.cols,0),CV_RGB(255,0,0),7,CV_AA,0);

        imwrite("out.png", image); 

        cv::namedWindow("Transparent", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
        cv::imshow("Transparent",image);
        waitKey(0);

        Mat temp(image);
         cv::line(temp,cv::Point(0,0),cv::Point(temp.cols,temp.rows),CV_RGB(255,0,0),7,CV_AA,0);
        cv::line(temp,cv::Point(0,temp.rows),cv::Point(temp.cols,0),CV_RGB(255,0,0),7,CV_AA,0);
        double opacity = 0.9;
        cv::addWeighted(temp,opacity,image,1 - opacity,0,image);
        cv::namedWindow("opacity",CV_WINDOW_AUTOSIZE);
        cv::imshow("opacity",image);
        imwrite("opacity.png",image);
        waitKey(0);



        string path="myimage.png";
        Mat myImage(image.rows,image.cols,CV_8UC4);
        myImage=cv::Scalar(255,255,255,0);
        cv::line(myImage,cv::Point(0,0),cv::Point(image.cols,image.rows),CV_RGB(255,0,0),7,CV_AA,0);
        cv::line(myImage,cv::Point(0,image.rows),cv::Point(image.cols,0),CV_RGB(255,0,0),7,CV_AA,0);
        imwrite(path,myImage);

我已经尝试了所有这3种方法,所有这些都产生了相同的图片。

1 个答案:

答案 0 :(得分:6)

我认为宏CV_RGB会为您创建一个条目为cv::Scalar的{​​{1}}。

此代码适用于我:

(b,g,r,0)

有了这个结果:

enter image description here

相关问题