2017-07-27 14 views
3

私はを使用して、3チャネルcv::Matにアクセスする方法を知っています。しかし、今私はnチャネルcv::Matnは(cv::Vec<uchar, n>を使用する)定数ではありません。今すぐcv::Matチャンネルにアクセスするにはどうすればよいですか?opencvでMatのn番目のチャンネルにアクセスするには?

+0

@DimChtzの答えは完璧です、あなたもあなたのマットとのアクセスに '.toListを()'使用することができます要素。 –

+1

['cv :: Mat :: ptr'](http://docs.opencv.org/3.1.0/d3/d63/classcv_1_1Mat.html#a47ead5654d6577e63a3e154b57976a36)を使用してください。 @RickM。 –

+0

私はこれをJavaと混在させていると思います。 C++ APIにはこのようなことはありません。あなたが参照している答えは完全ではありません。チャンネル数をハードコードする必要があるため、問題を完全に解決することはできません。 @RickM。 –

答えて

2

たとえば、n = 10と言って、の4thチャンネルにアクセスしたいとします。ここに簡単な例があります:

typedef cv::Vec<uchar, 10> Vec10b; 

// .... 

// Create the mat 
cv::Mat_<Vec10b> some_mat; 

// Access 4th channel 
uchar value = some_mat.at<Vec10b>(i,j)(4); 

// or 
uchar value = some_mat.at<Vec10b>(i,j)[4]; 

希望します。 typedef行を省略できることに注意してください。この方法は簡単だと思います。

+0

答えてくれてありがとうございます。コンパイル時に定義されておらず、cv :: Vecでnを使用すると、は "式は定数値を持たなければならない"と言います。 – ahamid555

+0

@ ham.aはい 'cv :: Vec 'は動作せず、AFAIKこれはopencvでは不可能です。私は私の答えがあなたが持っている(opencvを使用して)最高のソリューションだと信じています。 – DimChtz

+0

だから、唯一の解決策はstd :: vector を使うことだと思います。 – ahamid555

0

任意の数のチャネルを処理できるようにするには、cv::Mat::ptrといくつかのポインタ算術演算を使用できます。例えば

、次のようになりますのみCV_8Uデータ型をサポートする単純なアプローチ:

#include <opencv2/opencv.hpp> 
#include <cstdint> 
#include <iostream> 

inline uint8_t get_value(cv::Mat const& img, int32_t row, int32_t col, int32_t channel) 
{ 
    CV_DbgAssert(channel < img.channels()); 
    uint8_t const* pixel_ptr(img.ptr(row, col)); 
    uint8_t const* value_ptr(pixel_ptr + channel); 
    return *value_ptr; 
} 

void test(uint32_t channel_count) 
{ 
    cv::Mat img(128, 128, CV_8UC(channel_count)); 
    cv::randu(img, 0, 256); 

    for (int32_t i(0); i < img.channels(); ++i) { 
     std::cout << i << ":" << get_value(img, 32, 32, i) << "\n"; 
    } 
} 

int main() 
{ 
    for (uint32_t i(1); i < 10; ++i) { 
     test(i); 
    } 

    return 0; 
} 
関連する問題