Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ opencv:填充cv::mat的不同方法_C++_Opencv - Fatal编程技术网

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

C++ 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(

我知道对于fill a
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。如果你加或乘任何东西,它将保持在255
  • 为什么在创建垫子时使用
    cv::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(不透明)是有意义的,因此颜色空间变换不会改变图像的外观。