1. cv::imshow
在使用cv::imshow输出图像时,会将图像数据映射到[0,255]之间;所以对于:
- 图像类型为CV_8U时,正常输出图像,因为此类型数据范围为[0,255];
- 图像类型为CV_16U或CV_32S时,图像数据会除以255.0,最终映射到所需要的[0,255] ;
- 图像类型为CV_32F或CV_64F时,图像数据会乘上255.0,最终映射到所需要的[0,255] ;
对于后两种,在cv::imshow前需要做归一化;例如一副图像类型为CV_32F,那么需要将它归一化到[0,1],这样最后显示结果才是正常的;假设不做normalize,图像中大于1的数据会乘上255再显示,这样的显示出的结果一定是白色的,就无法体现图像本身。
2、Mat赋值
Mat赋值时,注意类型;灰度图为例子,比如图像类型为CV_8UC1,那么赋值时,应该写为mat.at< uchar >(i, j);类型为CV_32SC1时,应该写成mat.at< int >(i, j);类型为CV_32FC1时,应该写成mat.at< float >(i, j);
3、cv::calchist
- bins为需分类数量;
- range[]为图像像素范围;
- 得到的结果图hist为每个bin的统计总数。
4、opencv 使用分类器时需注意的问题
- 训练的数据data为CV_32F类型,输入数据时,注意查看data具体的值,避免出现超出范围的值,导致训练后,输出结果每次都不同,或者会出现这种错误:Assertion failed (sv_count != 0) in cv::ml::SVMImpl::do_train;
- 标签数据为CV_32S类型,训练器只能输入这个类型的responses。