我有这个功能:
int testImageAndGradients(int argc, char **argv) {
if (argc != 2) {
std::cout << "Need filename..." << std::endl;
return 1;
}
Mat im = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
Mat imfloat, dx, dy;
im.convertTo(imfloat, CV_32FC1);
Mat u(imfloat.size(), imfloat.type());
int & X = im.cols;
int & Y = im.rows;
Sobel(imfloat, dx, CV_32F, 1, 0, 3);
Sobel(imfloat, dy, CV_32F, 0, 1, 3);
Mat tmp, output(Size(3*X,Y),CV_8UC1);
double minval, maxval;
minMaxLoc(imfloat, &minval, &maxval);
imfloat.convertTo(tmp, CV_8UC1, 255 / (maxval - minval), -minval);
tmp.copyTo(output(Rect(0, 0, X, Y)));
minMaxLoc(dx, &minval, &maxval);
dx.convertTo(tmp, CV_8UC1, 255 / (maxval - minval), -minval);
tmp.copyTo(output(Rect(X, 0, X, Y)));
minMaxLoc(dy, &minval, &maxval);
dy.convertTo(tmp, CV_8UC1, 255 / (maxval - minval), -minval);
tmp.copyTo(output(Rect(2*X, 0, X, Y)));
namedWindow("Img/Dx/Dy", WINDOW_AUTOSIZE);
imshow("Img/Dx/Dy", output);
waitKey(0);
return 1;
}
其目的是可视化三个图像:原始图像,x渐变和y渐变。据我了解,调用convertTo
应该使用最后两个参数执行规范化,但是我在示例中只能看到以下内容:
这不是我所期望的,我经常使用opencv遇到比例因子等问题(不幸的是,我经常需要在float和uchar之间进行转换)。
有人可以解释实际发生的情况,并且通常是解决规模问题的正确程序吗?