在实际中看到的应用
cv::Mat A = cv::imread(argv[1], 0);
cv::Size patchSize(100, 100);
cv::Point topleft(A.cols / 2, A.rows / 2); //定义图像中间的点
cv::Rect roi(topleft.x, topleft.y, patchSize.width, patchSize.height); //定义矩形,大小为parthSize,位置为图像A中中间的位置(x,y)
cv::Mat B = A(roi); //根据这个在图片A上矩形roi大小的区域构建,矩阵B
//cv::getOptimalDFTSize函数返回一个随机数生成器,该生成器的范围是(矩阵A的行数+矩阵B的行数-1,A的列数+B的列数-1)
int dft_M = cv::getOptimalDFTSize(A.rows + B.rows - 1);
int dft_N = cv::getOptimalDFTSize(A.cols + B.cols - 1);
//cv::Mat::zeros构建一个全0矩阵,它的大小为dft_M行,dft_N列,数据类型为cv_32f
cv::Mat dft_A = cv::Mat::zeros(dft_M, dft_N, CV_32F);
cv::Mat dft_B = cv::Mat::zeros(dft_M, dft_N, CV_32F);
//从矩阵dft_A中位置(0,0)的位置,取大小为 A.cols, A.rows的部分
cv::Mat dft_A_part = dft_A(cv::Rect(0, 0, A.cols, A.rows));
cv::Mat dft_B_part = dft_B(cv::Rect(0, 0, B.cols, B.rows));
//将A转换为dft_A_part.type()类型,输出到dft_A_part中,
//将数组转换为具有可选缩放功能的其他数据类型。
A.convertTo(dft_A_part, dft_A_part.type(), 1, -mean(A)[0]);
B.convertTo(dft_B_part, dft_B_part.type(), 1, -mean(B)[0]);
查找资料
定位源码
描述太少,而且定位的位置好像也不太对
查看文档
这个符合我遇到的情况:
将数组转换为具有可选缩放功能的其他数据类型。
该方法将源像素值转换为目标数据类型。在末尾应用saturate_cast<>,以避免可能的溢出:
参数
输出矩阵;如果在操作之前没有合适的大小或类型,则重新分配。
期望的输出矩阵类型,或者更确切地说,深度,因为通道的数量与输入的相同;如果rtype为负,则输出矩阵将具有与输入相同的类型。
缩放的比例因子。
对缩放后的值求和。
理解
在我遇到的例子中的作用
//将A转换为dft_A_part.type()类型,输出到dft_A_part中,比例为1保持不变,对缩放后的值求平均,取第一个使用
//将数组转换为具有可选缩放功能的其他数据类型。
A.convertTo(dft_A_part, dft_A_part.type(), 1, -mean(A)[0]);
B.convertTo(dft_B_part, dft_B_part.type(), 1, -mean(B)[0]);
这是截取的文档示例的一部分
/* brightness/contrast callback function */
static void updateBrightnessContrast( int /*arg*/, void* )
{
int histSize = 64;
int brightness = _brightness - 100;
int contrast = _contrast - 100;
/*
* The algorithm is by Werner D. Streidt
* (http://visca.com/ffactory/archives/5-99/msg00021.html)
*/
double a, b;
if( contrast > 0 )
{
double delta = 127.*contrast/100;
a = 255./(255. - delta*2);
b = a*(brightness - delta);
}
else
{
double delta = -128.*contrast/100;
a = (256.-delta*2)/255.;
b = a*brightness + delta;
}
Mat dst, hist;
image.convertTo(dst, CV_8U, a, b);
imshow("image", dst);