opencv cv::Mat::convertTo()函数

在实际中看到的应用

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]);

查找资料

定位源码

opencv cv::Mat::convertTo()函数_第1张图片
描述太少,而且定位的位置好像也不太对

查看文档

opencv cv::Mat::convertTo()函数_第2张图片
这个符合我遇到的情况:

将数组转换为具有可选缩放功能的其他数据类型。

该方法将源像素值转换为目标数据类型。在末尾应用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);

你可能感兴趣的:(OpenCV)