【问题标题】:Convert vec3b into mat将 vec3b 转换为 mat
【发布时间】:2014-12-28 12:24:21
【问题描述】:

我在im 中有彩色图像,我想使用 vec3b 使用以下代码获取 3 通道图像的像素值

    for (int i = 0; i < im.rows; i++)
{
    for (int j = 0; j < im.cols; j++)
    {
        for (int k = 0; k < nChannels; k++)
        {
            zay[k] = im.at<Vec3b>(i, j)[k]; //get the pixel value and assign to new vec3b variable zay


        }

    }

}

之后,我想将下面的 mat 3x3 过滤器与 zay 中的 vec3b 相乘

    Filter= (Mat_<double>(3, 3) << 0, 0, 0,
                                0, 1, 0,
                                0, 0, 0);

如何将 vec3b 转换为 mat 矩阵,以便我可以乘以 mat 过滤器? vec3b 是一个 3x1 的数组? 谢谢

【问题讨论】:

  • 我猜手动计算会更容易更快(可能在宏/函数中): Vec3b temp; temp[0] = zay[0] * Filter.at(0,0) + ...
  • 但我想转换为 mat,因为我需要灵活的矩阵。所以我可以轻松操作ab和ba

标签: c++ opencv mat


【解决方案1】:

根据您的示例,您尝试完成的操作称为与内核的卷积

您可以设置内核并调用cv::filter2D() 为您应用它:

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main()
{
    cv::Mat img = cv::imread("input.jpg");
    if (img.empty())
    {
        std::cout << "!!! Failed to open input image" << std::endl;
        return -1;
    }

    cv::Mat kernel = (cv::Mat_<float>(3, 3) << 0, 0, 0,
                                               0, 1, 0,
                                               0, 0, 0);

    cv::Mat dst;
    cv::filter2D(img, dst, -1, kernel, cv::Point(-1, -1), 0, cv::BORDER_DEFAULT);

    cv::imshow("output", dst);
    cv::waitKey(0);

    return 0;
}

因此,无需迭代像素并自行执行计算。 OpenCV 文档解释了这一切:Making your own linear filters!

【讨论】:

    【解决方案2】:

    没有尝试,但应该可以:

    cv::Mat DoubleMatFromVec3b(cv::Vec3b in)
    {
        cv::Mat mat(3,1, CV_64FC1);
        mat.at <double>(0,0) = in [0];
        mat.at <double>(1,0) = in [1];
        mat.at <double>(2,0) = in [2];
    
        return mat;
    };
    

    【讨论】:

    • 我喜欢它。干净简单,+1。
    猜你喜欢
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    相关资源
    最近更新 更多