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

最佳答案

通用的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<<", "; });

您可以对连续 channel 进行一些优化,那么看起来
/**
 *@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将支持模板。

只要通道类型基于字节(非字节),此方法就可用于任意数量的通道
channel 可能无法正常工作。

关于opencv - 打印cv::Mat opencv,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16249325/

10-11 22:45
查看更多