cv::Mat 画像にアクセスする方法はたくさんあります。カラー画像 ( CV_8UC3 ) に直接アクセスしたい場合は、次のように実装できます。
int count = 0;
int threshold = 150;
for(int j = 0; j < img.rows; j++) {
for(int i = 0; i < img.cols; i++) {
//white point which means that the point in every channel(BGR)
//are all higher than threshold!
if(img.ptr<cv::Vec3b>(j)[i][0] > threshold &&
img.ptr<cv::Vec3b>(j)[i][1] > threshold
img.ptr<cv::Vec3b>(j)[i][2] > threshold ) {
count++;
}
}
}
ただし、白色点のみをカウントする場合は、画像をグレースケール ( CV_8UC1 ) に変換して、次のようにすることをお勧めします。
cv::Mat img;
cv::cvtColor(src,img,CV_BGR2RGB);
int count = 0;
int threshold = 150;
for(int j = 0; j < img.rows; j++) {
for(int i = 0; i < img.cols; i++) {
if(img.ptr<uchar>(j)[i] > threshold) {
count++;
}
}
}
最後に、 img.ptr< Imagetype >による cv::Mat 画像へのアクセスは、アクセスしたポイントが正しいかどうかをチェックしないことに注意してください。そのため、画像の範囲が確実にわかっている場合は、ptr による画像へのアクセスで問題ありません。img.at< Imagetype>()によって、呼び出しのたびにすべてのポイントが正しいことを確認します。なぜ ptr によるイメージへのアクセスが高速なの
か、無効なアクセス ポイントがある場合はアサートします!