设置cv::Mat的深度
Setting up depth for a cv::Mat
我想测试一个函数,它正在寻找特定的垫深&&通道数
它有一个测试…
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 ?
还有什么我必须做的吗?
当你在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上得到0::Mat M(255,255,cv_32fc3),我在我的计算机上测试了它,它返回5。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- Difference in displaying cv2 Mat
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- OpenGL在启用深度测试时不会丢弃我的碎片
- 将CHW格式的浮点向量转换为cv::Mat
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- 试图找到二叉树的深度
- OpenCV 和从 OutputArrays 或 (Mat) 读取数据
- 使用 mat.at<uchar>(i,j) 的 opencv C++中的矩阵赋值错误
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 操纵安卓相机的深度图导致应用程序崩溃
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 深度值没有意义 R200 相机
- 将 cv::mat 转换为 QImage
- 对如何制作双链表的深度副本感到困惑?
- 使用pcl将存储在Mat中的深度图转换为点云
- 设置cv::Mat的深度
- opencv::使用深度图的Mat结构
- 从 Iplimage 转换为 Mat 不会保留深度信息