私の画像を含む cv::Mat を印刷しようとしています。ただし、cout を使用してマットを印刷すると、2D 配列がテキスト ファイルに印刷されます。1 ピクセルを 1 行に 1 つずつ印刷したい。cv::Mat から線単位のピクセルを印刷するにはどうすればよいですか。
質問する
1212 次
1 に答える
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);
}
}
この種の一般的なループは、私を何度も助けてくれます。役に立つことを願っています。バグがある場合、またはより良いアイデアがある場合は、教えてください。
opencl 用の一般的なアルゴリズムもいくつか設計したいと考えています。残念ながらテンプレートをサポートしていません。いつの日か CUDA がオープン スタンダードになるか、opencl がテンプレートをサポートすることを願っています。
これは、チャネル タイプがバイト ベースである限り、任意の数のチャネルで機能します。非バイト チャネルは機能しない可能性があります。
于 2013-04-27T17:00:37.880 に答える