6

我想测试一个正在寻找特定垫子深度&&通道数的函数

它有一个测试...

if (image.channels() == 1 && image.depth() == 8) ...
else if (image.channels() == 1 && image.depth() == 16)  ...
else if (image.channels() == 1 && image.depth() == 32)  ...
else
{  
  if ((image.channels() != 3) || (image.depth() != 8)) 
  {printf("Expecting rgb24 input image"); return false;}
  ...
}

我更喜欢用人造垫子进行测试,以避免使用本地资源:

cv::Mat M(255, 255, CV_8UC3, cv::Scalar(0,0,255));
printf("M: %d %d \n", M.channels(), M.depth());
cv::Mat M1(255, 255, CV_32F, cv::Scalar(0,0,255));
cv::Mat M2(255, 255, CV_32FC3, cv::Scalar(0,0,255));
cv::Mat M2(255, 255, CV_8SC3, cv::Scalar(0,0,255));

我已经尝试过各种组合,但如果我打印,我会得到 0 深度。

我也尝试加载 png 或 jpg 文件 - 结果相同(我不喜欢使用外部文件......但我看不出为什么这不起作用)

cv::Mat M3 = cv::imread( "c:/my_image.png", CV_LOAD_IMAGE_COLOR );
cv::Mat M3 = cv::imread( "c:/my_image.jpg", CV_LOAD_IMAGE_COLOR );

他们似乎都有 depth = 0 ?

我还有其他事情要做吗?我在文档中看不到任何内容。

4

1 回答 1

9

当您在 Mat 上调用 depth() 时,它返回如下定义的深度值而不是位数:

#define CV_8U   0
#define CV_8S   1
#define CV_16U  2
#define CV_16S  3
#define CV_32S  4
#define CV_32F  5
#define CV_64F  6

您可以使用 cv::DataDepth::value 来确定哪个是哪个。例如,

cv::DataDepth<unsigned char>::value == CV_8U;
cv::DataDepth<float>::value == CV_32F;

所以你应该在所有 CV_8UCX 矩阵上得到 0,当你加载一个图像时,它通常被加载为 CV_8UC3,所以你也会得到 0。但我不知道为什么你在 cv::Mat M(255, 255, CV_32FC3) 上得到 0,我在我的电脑上测试它,它返回 5。

于 2013-05-29T16:59:44.167 回答