各チャンネルにアクセスする方法は次のとおりです。
blue = frame.at<cv::Vec3b>(i,j)[0];
green = frame.at<cv::Vec3b>(i,j)[1];
red = frame.at<cv::Vec3b>(i,j)[2];
上記のコードは、各値が8 ビットの unsigned char ( CV_8UC3
)である 3 チャネルの画像があることを前提としています。このタイプは、多くの一般的な画像形式で使用されます。ただし、別のタイプの 3 チャンネル画像がある場合は、次のようにします。
- 画像タイプが 3 チャンネル float (
CV_32FC3
) の場合はcv::Vec3b
、cv::Vec3f
- 画像タイプが 3 チャンネル ダブル (
CV_64FC3
) の場合はcv::Vec3b
、cv::Vec3d
- 画像タイプが 3 チャネル int (
CV_32SC3
) の場合はcv::Vec3b
、cv::Vec3i
- 画像タイプが 3 チャネルの short int (
CV_16SC3
) または 16 ビットの uchar ( CV_16UC3
) の場合はcv::Vec3b
、cv::Vec3s
使用している画像形式がわからない場合 呼び出してみてくださいgetImgType(frame)
(以下のコードを参照)。
string getImgType(cv::Mat frame)
{
int imgTypeInt = frame.type();
int numImgTypes = 28; // 7 base types, with 4 channel options each (C1, ..., C4)
int enum_ints[] = {CV_8UC1, CV_8UC2, CV_8UC3, CV_8UC4, CV_8SC1, CV_8SC2, CV_8SC3, CV_8SC4, CV_16UC1, CV_16UC2, CV_16UC3, CV_16UC4, CV_16SC1, CV_16SC2, CV_16SC3, CV_16SC4, CV_32SC1, CV_32SC2, CV_32SC3, CV_32SC4, CV_32FC1, CV_32FC2, CV_32FC3, CV_32FC4, CV_64FC1, CV_64FC2, CV_64FC3, CV_64FC4};
string enum_strings[] = {"CV_8U", "CV_8UC1", "CV_8UC2", "CV_8UC3", "CV_8UC4", "CV_8SC1", "CV_8SC2", "CV_8SC3", "CV_8SC4", "CV_16UC1", "CV_16UC2", "CV_16UC3", "CV_16UC4", "CV_16SC1", "CV_16SC2", "CV_16SC3", "CV_16SC4", "CV_32SC1", "CV_32SC2", "CV_32SC3", "CV_32SC4", "CV_32FC1", "CV_32FC2", "CV_32FC3", "CV_32FC4", "CV_64FC1", "CV_64FC2", "CV_64FC3", "CV_64FC4"};
for(int i=0; i<numImgTypes; i++)
{
if(imgTypeInt == enum_ints[i]) return enum_strings[i];
}
return "unknown image type";
}