访问 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 访问图像更快
,所以如果有无效的访问点,它会断言你!