将 vec3b 转换为 mat

Posted

技术标签:

【中文标题】将 vec3b 转换为 mat【英文标题】:Convert vec3b into 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);

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

【问题讨论】:

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

以上是关于将 vec3b 转换为 mat的主要内容,如果未能解决你的问题,请参考以下文章

将 Mat 转换为 **float

将 arma::cx_mat 转换为数组数组

将 Magick::Image 转换为 cv::Mat

将犰狳中的矩阵从稀疏转换为密集(spmat 到 mat)

将vector<Mat>转换为矢量文件Opencv

将 IplImage 转换为 Mat 时出错