2
我试图打印包含我的图像的cv :: Mat。然而,无论何时我使用cout打印Mat,将一个2D数组打印到我的文本文件中。我只想在一行中打印一个像素。我如何从cv :: Mat打印明线像素。打印cv :: Mat opencv
我试图打印包含我的图像的cv :: Mat。然而,无论何时我使用cout打印Mat,将一个2D数组打印到我的文本文件中。我只想在一行中打印一个像素。我如何从cv :: Mat打印明线像素。打印cv :: Mat opencv
一个通用的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);
}
}
这种通用循环让我很多次,我希望你觉得它有帮助。如果t这里有 任何错误,或者你有更好的主意,请告诉我。
我想为opencl设计一些通用算法,可惜它不支持 模板,我希望有一天CUDA将成为开放标准,否则opencl将支持模板。
这适用于任何数量的通道,只要通道类型基于字节,非字节 通道可能不起作用。