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项目中最慢的函数