从 4 维 cv::Mat 中提取一个颜色通道

Extract one colour channel from 4-dimensional cv::Mat

我正在使用 OpenCV 一段时间,并尝试使用 DNN 扩展。我的模型具有像素深度为 uint8 的输入形状 [1, 3, 224, 244]。所以我把我的 m_inputImg 放在函数中,它有 3 个通道和 8 位像素深度:

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);

但我得到的是类似的东西(见图)。我真的很困惑,有人可以帮忙或有好的建议吗? 谢谢

cv::Size() 将使用原始图像大小。您错误地解释了数据。以下是从 lenna 图像解释 512x512 (cv::Size()) 加载的 blob-start 的 4 种方法:

输入 (512x512):

  1. blob-start 作为 512x512 单通道图像:

  1. blob-start 作为 512x512 BGR 图像:

  1. blob-start 作为 224x224 BGR 图像:

  1. blob-start 作为 224x224 单通道:

代码如下:

int main()
{
    cv::Mat img = cv::imread("C:/data/Lenna.png"); // 8UC3
    cv::imshow("img", img);


    cv::Mat blob;
    cv::dnn::blobFromImage(img, blob, 1.0, cv::Size(), cv::Scalar(), false, false, CV_8U);

    cv::Mat redImg = cv::Mat(img.rows,
        img.cols,
        CV_8UC1,
        blob.ptr<uint8_t>(0, 0));

    cv::imshow("blob 1", redImg);
    cv::imwrite("red1.jpg", redImg);

    cv::Mat redImg3C = cv::Mat(img.rows,
        img.cols,
        CV_8UC3,
        blob.ptr<uint8_t>(0, 0));

    cv::imshow("redImg3C", redImg3C);
    cv::imwrite("red3C.jpg", redImg3C);

    cv::Mat redImg224_3C = cv::Mat(224,
        224,
        CV_8UC3,
        blob.ptr<uint8_t>(0, 0));

    cv::imshow("redImg224_3C", redImg224_3C);
    cv::imwrite("redImg224_3C.jpg", redImg224_3C);

    cv::Mat redImg224_1C = cv::Mat(224,
        224,
        CV_8UC1,
        blob.ptr<uint8_t>(0, 0));

    cv::imshow("redImg224_1C", redImg224_1C);
    cv::imwrite("redImg224_1C.jpg", redImg224_1C);
    

    cv::waitKey(0);
}

恕我直言,您必须在代码中执行以下操作:

cv::dnn::blobFromImage(m_inputImg, blob, 1.0, cv::Size(), cv::Scalar(), false, false, CV_8U);

cv::Mat blueImg  = cv::Mat(m_inputImg.rows,
                        m_inputImg.cols,
                        CV_8UC3,
                        blob.ptr<uint8_t>(0, 0);

cv::dnn::blobFromImage(m_inputImg, blob, 1.0, cv::Size(cp->getModelConfigs().model[0].input.width , cp->getModelConfigs().model[0].input.height), cv::Scalar(), false, false, CV_8U);

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);

此外,这里是将空间斑点图像大小设置为固定大小(例如所需的 DNN 输入大小)的版本:

    cv::Mat blob2;
    cv::dnn::blobFromImage(img, blob2, 1.0, cv::Size(224,224), cv::Scalar(), false, false, CV_8U);

    cv::Mat blueImg224_1C = cv::Mat(224,
        224,
        CV_8UC1,
        blob2.ptr<uint8_t>(0, 0));

    cv::imshow("blueImg224_1C", blueImg224_1C);
    cv::imwrite("blueImg224_1C.jpg", blueImg224_1C);

提供这张图片: