打印 cv::Mat opencv

Posted

技术标签:

【中文标题】打印 cv::Mat opencv【英文标题】:Print cv::Mat opencv 【发布时间】:2013-04-27 07:01:28 【问题描述】:

我正在尝试打印包含我的图像的 cv::Mat。但是,每当我使用 cout 打印 Mat 时,都会在我的文本文件中打印一个 2D 数组。我只想在一行中打印一个像素。如何从 cv::Mat 打印逐行像素。

【问题讨论】:

【参考方案1】:

一个通用的 for_each 循环,你可以用它来打印你的数据

/**
 *@brief implement details of for_each_channel, user should not use this function
 */
template<typename T, typename UnaryFunc>
UnaryFunc for_each_channel_impl(cv::Mat &input, int channel, UnaryFunc func)

    int const rows = input.rows;
    int const cols = input.cols;
    int const channels = input.channels();
    for(int row = 0; row != rows; ++row)
        auto *input_ptr = input.ptr<T>(row) + channel;
        for(int col = 0; col != cols; ++col)
            func(*input_ptr);
            input_ptr += channels;
        
    

    return func;

像这样使用它

for_each_channel_impl<uchar>(input, 0, [](uchar a) std::cout<<(size_t)a<<", "; );

你可以对连续通道做一些优化,那么它可能看起来像

/**
 *@brief apply stl like for_each algorithm on a channel
 *
 * @param
 *  T : the type of the channel(ex, uchar, float, double and so on)
 * @param
 *  channel : the channel need to apply for_each algorithm
 * @param
 *  func : Unary function that accepts an element in the range as argument
 *
 *@return :
 *  return func
 */
template<typename T, typename UnaryFunc>
inline UnaryFunc for_each_channel(cv::Mat &input, int channel, UnaryFunc func)

    if(input.channels() == 1 && input.isContinuous())
        return for_each_continuous_channels<T>(input, func);
    else
        return for_each_channel_impl<T>(input, channel, func);
    

这种通用循环为我节省了很多时间,希望对您有所帮助。如果有 任何错误,或者你有更好的主意,请告诉我。

我也想为opencl设计一些通用算法,遗憾的是它不支持 模板,我希望有一天CUDA会成为一个开放标准,或者opencl会支持模板。

这适用于任意数量的通道,只要通道类型基于字节,非字节 频道可能无法正常工作。

【讨论】:

以上是关于打印 cv::Mat opencv的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 2.1:ostream operator<< for cv::Mat 在哪里?

矩阵的简单传递,即。 cv::Mat 到 OpenCV2.4 中的函数

opencv如何打印长图?

打印 CV_32F opencv 矩阵值

记录一个问题android下的ucontext协程,因为使用栈上的对象,导致cv::Mat被莫名析构

CV::Mat介绍