将vec3b转换成垫子

时间:2014-12-28 12:24:21

标签: c++ opencv mat

我在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


        }

    }

}

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

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

如何将vec3b转换为mat矩阵,这样我就可以使用mat Filter? vec3b是一个3x1阵列? 感谢

2 个答案:

答案 0 :(得分:3)

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

您可以设置内核并调用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!

答案 1 :(得分:1)

没有尝试,但应该工作:

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