opencv:填充cv :: mat的不同方法

时间:2013-11-15 11:57:58

标签: c++ opencv

我知道填充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纹理

2 个答案:

答案 0 :(得分:2)

我猜“不工作”意味着输出与使用setTo不相同?

  1. 使用cv::cvtColor进行转换时,alpha通道初始化为255.如果添加或乘以任何内容,它将保持为255.
  2. 为什么在创建垫子时使用cv::cvtColor进行转换而不是仅使用CV_8UC4
  3. 您无法使用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