OpenCV:填写 CV::MAT 的不同方法

opencv: different ways to fill a cv::mat

本文关键字:方法 MAT 填写 CV OpenCV      更新时间:2023-10-16

我知道对于填充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 不同?

  1. 当用cv::cvtColor变换时,α通道被初始化为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) ) .

对于 aplha 通道,您需要使用 CV_8UC4 ,而不是 CV_8UC3