2013-04-27 4 views
2

Я пытаюсь распечатать cv :: Mat, который содержит мое изображение. Однако всякий раз, когда я печатаю Mat с использованием cout, 2D-массив печатается в текстовом файле. Я хочу напечатать один пиксель только в одной строке. Как я могу напечатать мудрый пиксель линии cv :: Mat.Печать cv :: Mat opencv

ответ

0

Общий цикл 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 будет поддерживать шаблон.

Это работает для любого количества каналов, если тип каналов базируется на байте, а не байт канал может не работать.

Смежные вопросы