我知道填充cv::Mat
有一个很好的cv::Mat::setTo
方法,但我不明白为什么我对这些代码片段没有相同的效果:
// build the mat
m = cv::Mat::zeros(size, CV_8UC3);
cv::cvtColor(m, m, CV_BGR2BGRA); // add alpha channel
/////////////////////////////////////////////////////////// this works
m.setTo( cv::Scalar(0,144,0,55) );
m = cv::Mat::zeros(size, CV_8UC3);
cv::cvtColor(m, m, CV_BGR2BGRA);
/////////////////////////////////////////////////////////// this does NOT work
m = m + cv::Scalar(0,144,0,55)
m = cv::Mat::ones(size, CV_8UC3);
cv::cvtColor(m, m, CV_BGR2BGRA);
/////////////////////////////////////////////////////////// this does NOT work
m = m.mul( cv::Scalar(0,144,0,55) );
m = cv::Mat::zeros(size, CV_8UC3);
cv::cvtColor(m, m, CV_BGR2BGRA);
/////////////////////////////////////////////////////////// this works too!
cv::rectangle(tracks,
cv::Rect(0, 0, tracks.cols, tracks.rows),
cv::Scalar(0,144,0,55),
-1);
PS:我将这些垫子显示为OpenGL alpha纹理
答案 0 :(得分:2)
我猜“不工作”意味着输出与使用setTo不相同?
cv::cvtColor
进行转换时,alpha通道初始化为255.如果添加或乘以任何内容,它将保持为255. cv::cvtColor
进行转换而不是仅使用CV_8UC4
?cv::Mat::ones
进行多渠道初始化。使用cv::Mat::ones
时,只有第一个通道设置为1。使用cv::Mat( x, y, CV_8UC3, CV_RGB(1,1,1) )
。答案 1 :(得分:0)
对于aplha频道,您需要使用CV_8UC4
,而不是CV_8UC3
。