我想测试一个寻找特定垫深度&&amp ;;的功能。频道数量
它有一个测试...
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 );
他们似乎都有深度= 0?
还有什么我需要做的吗?我在文档中看不到任何内容......
谢谢
答案 0 :(得分: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.