opencv convertTo的实现
OpenCV中的convertTo函数用于将一幅图像的像素值类型转换为另一种类型。其函数原型如下:
void cv::Mat::convertTo(OutputArray dst, int rtype, double alpha=1, double beta=0) const
其中,参数说明如下:
dst:输出的目标图像,必须是一个已经分配好内存的Mat对象。rtype:输出的目标图像的像素值类型,可以是CV_8U、CV_16U、CV_32F等。alpha:缩放因子,用于对源图像进行缩放。beta:偏移量,用于对源图像进行平移。
convertTo函数的实现主要是通过调用Mat类的convertTo方法实现的。该方法的实现如下:
void Mat::convertTo(OutputArray _dst, int _type, double alpha, double beta) const
{
int sdepth = depth(), ddepth = CV_MAT_DEPTH(_type);
if( sdepth == ddepth && alpha == 1 && beta == 0 )
{
copyTo(_dst);
return;
}
CV_Assert( _type == CV_8U || _type == CV_16U || _type == CV_32F );
CV_Assert( sdepth == CV_8U || sdepth == CV_16U || sdepth == CV_32F );
Mat src = *this;
_dst.create( size(), _type );
Mat dst = _dst.getMat();
if( sdepth == CV_8U && ddepth == CV_16U )
convert8uTo16u( src.ptr(), src.step, dst.ptr<ushort>(), dst.step, src.size(), alpha, beta );
else if( sdepth == CV_8U && ddepth == CV_32F )
convert8uTo32f( src.ptr(), src.step, dst.ptr<float>(), dst.step, src.size(), alpha, beta );
else if( sdepth == CV_16U && ddepth == CV_8U )
convert16uTo8u( src.ptr<ushort>(), src.step, dst.ptr(), dst.step, src.size(), alpha, beta );
else if( sdepth == CV_16U && ddepth == CV_32F )
convert16uTo32f( src.ptr<ushort>(), src.step, dst.ptr<float>(), dst.step, src.size(), alpha, beta );
else if( sdepth == CV_32F && ddepth == CV_8U )
convert32fTo8u( src.ptr<float>(), src.step, dst.ptr(), dst.step, src.size(), alpha, beta );
else if( sdepth == CV_32F && ddepth == CV_16U )
convert32fTo16u( src.ptr<float>(), src.step, dst.ptr<ushort>(), dst.step, src.size(), alpha, beta );
else
CV_Error( CV_StsUnsupportedFormat, "" );
}
该方法首先判断源图像和目标图像的像素值类型是否相同以及缩放因子和偏移量是否为默认值,如果是,则直接调用copyTo方法将源图像复制到目标图像中。如果不是,则根据源图像和目标图像的像素值类型,调用不同的转换函数进行转换。
OpenCV中的convertTo函数提供了一种方便的方式来转换图像的像素值类型,可以用于图像处理中的各种应用,例如图像增强、图像滤波、图像分割等
原文地址: http://www.cveoy.top/t/topic/co53 著作权归作者所有。请勿转载和采集!