Opencv将.jpg背景透明

直接代码,可用

#include<iostream>
#include<opencv.hpp>
using namespace cv;
using namespace std;
Mat createAlpha(cv::Mat& src)
{
    cv::Mat alpha = cv::Mat::zeros(src.rows, src.cols, CV_8UC1);
    cv::Mat gray = cv::Mat::zeros(src.rows, src.cols, CV_8UC1);
    cv::cvtColor(src, gray, cv::COLOR_RGB2GRAY);
    for (int i = 0; i < src.rows; i++)
    {
        for (int j = 0; j < src.cols; j++)
        {
            alpha.at<uchar>(i, j) = 255 - gray.at<uchar>(i, j);
        }
    }
    return alpha;
}
int addAlpha(cv::Mat& src, cv::Mat& dst, cv::Mat& alpha)
{
    if (src.channels() == 4)
    {
        return -1;
    }
    else if (src.channels() == 1)
    {
        cv::cvtColor(src, src, cv::COLOR_GRAY2RGB);
    }
    dst = Mat(src.rows, src.cols, CV_8UC4);
    std::vector<cv::Mat> srcChannels;
    std::vector<cv::Mat> dstChannels;
    //分离通道
    cv::split(src, srcChannels);
    dstChannels.push_back(srcChannels[0]);
    dstChannels.push_back(srcChannels[1]);
    dstChannels.push_back(srcChannels[2]);
    //添加透明度通道
    dstChannels.push_back(alpha);
    //合并通道
    cv::merge(dstChannels, dst);
    return 0;
}
int main()
{
    cout << "hello world" << endl;
    Mat grayImage = imread("E:/fengce/0705/000.jpg");
    //Mat grayImage;
    //resize(image, grayImage,Size(1280,720));
    Mat dst;
    Mat alpha = createAlpha(grayImage);
    addAlpha(grayImage, dst, alpha);
    imwrite("1111111.png",dst);
    namedWindow("dst",WINDOW_NORMAL);
    imshow("dst", alpha);
    waitKey(0);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34510308/article/details/80938135