C++ opencv:填充cv::mat的不同方法
我知道对于fill aC++ opencv:填充cv::mat的不同方法,c++,opencv,C++,Opencv,我知道对于fill acv::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::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纹理我猜“不工作”意味着输出与使用setTo不同
cv::cvtColor
转换时,alpha通道初始化为255。如果你加或乘任何东西,它将保持在255cv::cvtColor
进行变换,而不是仅使用cv_8UC4
cv::Mat::ones
进行多通道初始化。使用cv::Mat::ones
时,只有第一个通道设置为1。使用cv::Mat(x,y,cv_8UC3,cv_RGB(1,1,1))
对于aplha频道,您需要使用
CV_8UC4
,而不是CV_8UC3
太好了,它完全符合您的要求!文件上有这些行为吗?显然没有,至少我找不到关于它的任何东西。对于alpha通道,将其设置为255(不透明)是有意义的,因此颜色空间变换不会改变图像的外观。