【发布时间】:2021-11-16 13:50:06
【问题描述】:
我正在使用 OpenCV 一段时间并尝试使用 DNN 扩展。我的模型具有像素深度为 uint8 的输入形状 [1, 3, 224, 244]。因此,我将具有 3 通道和 8 位像素深度的 m_inputImg 放入函数中:
cv::dnn::blobFromImage(m_inputImg, m_inputImgTensor, 1.0, cv::Size(), cv::Scalar(), false, false, CV_8U);
现在我有兴趣了解我的输入图像如何“放置”在 cv::Mat 张量中。理论上我知道张量的样子,但我不明白 OpenCV 是如何做到的。所以为了理解这一点,我想提取一个颜色通道。我试过这个:
cv::Mat blueImg = cv::Mat(cp->getModelConfigs().model[0].input.height,
cp->getModelConfigs().model[0].input.width,
CV_8UC3,
blob.ptr<uint8_t>(0, 0);
但我得到的是类似的东西(见图)。我真的很困惑,有人可以帮忙或有好的建议吗? 谢谢
【问题讨论】:
-
您的原始图像看起来如何?如果您只想显示 1 个通道,为什么要使用 CV_8UC3 恕我直言,您当前将整个张量显示为 BGRBGRBGR ...但是您的数据应该排列为 RRR...GGG...BBB ...您可以尝试使用CV_8UC1?恕我直言,那么您应该获得 RRR ... 图像。但我不确定为什么你的 blob 中有 9 张图片。
-
在你的 blob 创建中不应该是 cv::Size(224,224) 而不是 cv::Size()?
-
当我尝试 CV_8UC1 时,我的图像中只会出现噪点,因此我的指针可能会显示在未定义的区域。
-
对于尺寸参数 OpenCV 写这个:“尺寸:输出图像的空间尺寸”。所以在我看来 cv::Size(224, 224) 是错误的,因为输出“图像”是张量。但我不知道应该使用什么大小,所以我默认使用它(也许 OpenCV 知道我想要什么......:D)
-
在您的图像中,图像的前 1/3 是 blob 的第一个通道。由于您将单块通道解释为 3 通道图像,因此它将在显示图像的 1/3 之后读取图像的第二行,在显示图像的 2/3 处读取第三行。因为您阅读的行数超出预期,所以第二个通道从显示图像行的 1/3 开始,第三个通道从 2/3 开始。