C++ OpenCV:添加包含alpha信息的矩阵';相互叠加';使用C++; 请考虑下面的MWE。我有一个矩阵(输出),它对应一个图形输出缓冲区和一些层,这些层应该按照特定的顺序放入缓冲区。层包含alpha信息(最后一个字节)。如果所有层都将所有像素的alpha字节设置为0xFF,则只能看到顶部的层。如果所有的alpha值都设置为0,则看不到任何值。alpha值可能介于0和0xFF之间,因此相应的像素应该是半透明的

C++ OpenCV:添加包含alpha信息的矩阵';相互叠加';使用C++; 请考虑下面的MWE。我有一个矩阵(输出),它对应一个图形输出缓冲区和一些层,这些层应该按照特定的顺序放入缓冲区。层包含alpha信息(最后一个字节)。如果所有层都将所有像素的alpha字节设置为0xFF,则只能看到顶部的层。如果所有的alpha值都设置为0,则看不到任何值。alpha值可能介于0和0xFF之间,因此相应的像素应该是半透明的,c++,opencv,matrix,colors,C++,Opencv,Matrix,Colors,我尝试使用addWeighted(),但这没有帮助(见下文):无论alpha字节设置为什么值,所有图像都是可见的 你知道如何实现这一点吗 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; void test(){ namedWindow("window", WINDOW_AUTOSIZE); Mat output(Si

我尝试使用
addWeighted()
,但这没有帮助(见下文):无论alpha字节设置为什么值,所有图像都是可见的

你知道如何实现这一点吗

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

void test(){
    namedWindow("window", WINDOW_AUTOSIZE);

    Mat output(Size(300, 300), CV_8UC4, Scalar(0));

    Mat m1(Size(300, 300), CV_8UC4, Scalar(0));
    Mat m2(Size(300, 300), CV_8UC4, Scalar(0));
    Mat m3(Size(300, 300), CV_8UC4, Scalar(0));

    circle(m1, Point(130, 130), 75, Scalar(0, 0, 0xFF, 0xFF), -1);
    circle(m2, Point(150, 150), 75, Scalar(0, 0xFF, 0, 0xFF), -1);
    rectangle(m3, Rect(100, 100, 60, 60), Scalar(0xFF, 0, 0, 0xFF), -1);
    rectangle(m3, Rect(115, 115, 30, 30), Scalar(0), -1);

    /*
     Output should look like
    [   m3   ] <-- top
    [   m2   ]
    [   m1   ] <-- bottom
    */

    //What I've tried so far (the final solution should work for more than 3 'layers')
    m1.copyTo(output);
    addWeighted(output, .5, m2, .5, 0, output);
    addWeighted(output, .5, m3, .5, 0, output);

    imshow("window", output);
    cvWaitKey(0);

    destroyAllWindows();
}
#包括
#包括
使用名称空间cv;
无效测试(){
namedWindow(“窗口”,窗口自动大小);
Mat输出(大小(300300),CV_8UC4,标量(0));
材料m1(尺寸(300300),CV_8UC4,标量(0));
材料m2(尺寸(300300),CV_8UC4,标量(0));
材料m3(尺寸(300300),CV_8UC4,标量(0));
圆(m1,点(130130),75,标量(0,0,0xFF,0xFF),-1);
圆(m2,点(150,150),75,标量(0,0xFF,0,0xFF),-1);
矩形(m3,矩形(100,100,60,60),标量(0xFF,0,0,0xFF),-1);
矩形(m3,Rect(115,115,30,30),标量(0),-1);
/*
输出应该是

[m3]我不确定这是否是最好的方法,但这可能会起作用

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <stdio.h>

using namespace cv;

void addAlpha(Mat src, Mat input);

void test(){
    namedWindow("window", WINDOW_AUTOSIZE);

    Mat output(Size(300, 300), CV_8UC4, Scalar(0));

    Mat m1(Size(300, 300), CV_8UC4, Scalar(0));
    Mat m2(Size(300, 300), CV_8UC4, Scalar(0));
    Mat m3(Size(300, 300), CV_8UC4, Scalar(0));

    circle(m1, Point(130, 130), 75, Scalar(0, 0, 0xFF, 0xFF), -1);
    circle(m2, Point(150, 150), 75, Scalar(0, 0xFF, 0, 0xFF), -1);
    rectangle(m3, Rect(100, 100, 60, 60), Scalar(0xFF, 0, 0, 0xFF), -1);
    rectangle(m3, Rect(115, 115, 30, 30), Scalar(0), -1);


    m1.copyTo(output);

    addAlpha(output,m2);
    addAlpha(output,m3);

    imshow("window", output);
    cvWaitKey(0);

    destroyAllWindows();
}

void addAlpha(Mat src, Mat input){
    if(src.rows != input.rows || src.cols != input.cols){
        perror("Not same size");
    }
    for(int i = 0; i < src.rows; i++){
        for(int j = 0; j < src.cols; j++){
            src.at<cv::Vec4b>(i,j)[0] = src.at<cv::Vec4b>(i,j)[0] * (1 - input.at<cv::Vec4b>(i,j)[3]/255.0) + input.at<cv::Vec4b>(i,j)[0] * (input.at<cv::Vec4b>(i,j)[3]/255.0);
            src.at<cv::Vec4b>(i,j)[1] = src.at<cv::Vec4b>(i,j)[1] * (1 - input.at<cv::Vec4b>(i,j)[3]/255.0) + input.at<cv::Vec4b>(i,j)[1] * (input.at<cv::Vec4b>(i,j)[3]/255.0);
            src.at<cv::Vec4b>(i,j)[2] = src.at<cv::Vec4b>(i,j)[2] * (1 - input.at<cv::Vec4b>(i,j)[3]/255.0) + input.at<cv::Vec4b>(i,j)[2] * (input.at<cv::Vec4b>(i,j)[3]/255.0);
        }
    }
}
#包括
#包括
#包括
使用名称空间cv;
void addAlpha(Mat src,Mat输入);
无效测试(){
namedWindow(“窗口”,窗口自动大小);
Mat输出(大小(300300),CV_8UC4,标量(0));
材料m1(尺寸(300300),CV_8UC4,标量(0));
材料m2(尺寸(300300),CV_8UC4,标量(0));
材料m3(尺寸(300300),CV_8UC4,标量(0));
圆(m1,点(130130),75,标量(0,0,0xFF,0xFF),-1);
圆(m2,点(150,150),75,标量(0,0xFF,0,0xFF),-1);
矩形(m3,矩形(100,100,60,60),标量(0xFF,0,0,0xFF),-1);
矩形(m3,Rect(115,115,30,30),标量(0),-1);
m1.copyTo(输出);
addAlpha(输出,m2);
addAlpha(输出,m3);
imshow(“窗口”,输出);
cvWaitKey(0);
销毁所有窗口();
}
void addAlpha(材料src、材料输入){
if(src.rows!=input.rows | | src.cols!=input.cols){
perror(“不相同尺寸”);
}
对于(int i=0;i
据我所知,opencv中没有任何函数可以实现这一点,但您看过这一个吗:谢谢,它对我来说很有效,但速度非常慢。您知道如何加快它吗?您应该改变使用指针在Mat中迭代的方式。有很多方法可以做到这一点。我建议您阅读此处:,或sta中的其他答案对于初学者来说,at()函数是大多数opencv项目中最慢的函数