博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opencv
阅读量:4290 次
发布时间:2019-05-27

本文共 7652 字,大约阅读时间需要 25 分钟。

namespace hal {void resize(int src_type,            const uchar * src_data, size_t src_step, int src_width, int src_height,            uchar * dst_data, size_t dst_step, int dst_width, int dst_height,            double inv_scale_x, double inv_scale_y, int interpolation){    CV_INSTRUMENT_REGION()    CV_Assert((dst_width * dst_height > 0) || (inv_scale_x > 0 && inv_scale_y > 0));    if (inv_scale_x < DBL_EPSILON || inv_scale_y < DBL_EPSILON)    {        inv_scale_x = static_cast
(dst_width) / src_width; inv_scale_y = static_cast
(dst_height) / src_height; } CALL_HAL(resize, cv_hal_resize, src_type, src_data, src_step, src_width, src_height, dst_data, dst_step, dst_width, dst_height, inv_scale_x, inv_scale_y, interpolation); int depth = CV_MAT_DEPTH(src_type), cn = CV_MAT_CN(src_type); Size dsize = Size(saturate_cast
(src_width*inv_scale_x), saturate_cast
(src_height*inv_scale_y)); CV_Assert( dsize.area() > 0 ); CV_IPP_RUN_FAST(ipp_resize(src_data, src_step, src_width, src_height, dst_data, dst_step, dsize.width, dsize.height, inv_scale_x, inv_scale_y, depth, cn, interpolation)) static ResizeFunc linear_tab[] = { resizeGeneric_< HResizeLinear
, VResizeLinear
, VResizeLinearVec_32s8u> >, 0, resizeGeneric_< HResizeLinear
, VResizeLinear
, VResizeLinearVec_32f16u> >, resizeGeneric_< HResizeLinear
, VResizeLinear
, VResizeLinearVec_32f16s> >, 0, resizeGeneric_< HResizeLinear
, VResizeLinear
, VResizeLinearVec_32f> >, resizeGeneric_< HResizeLinear
, VResizeLinear
, VResizeNoVec> >, 0 }; static ResizeFunc cubic_tab[] = { resizeGeneric_< HResizeCubic
, VResizeCubic
, VResizeCubicVec_32s8u> >, 0, resizeGeneric_< HResizeCubic
, VResizeCubic
, VResizeCubicVec_32f16u> >, resizeGeneric_< HResizeCubic
, VResizeCubic
, VResizeCubicVec_32f16s> >, 0, resizeGeneric_< HResizeCubic
, VResizeCubic
, VResizeCubicVec_32f> >, resizeGeneric_< HResizeCubic
, VResizeCubic
, VResizeNoVec> >, 0 }; static ResizeFunc lanczos4_tab[] = { resizeGeneric_
, VResizeLanczos4
, VResizeNoVec> >, 0, resizeGeneric_
, VResizeLanczos4
, VResizeLanczos4Vec_32f16u> >, resizeGeneric_
, VResizeLanczos4
, VResizeLanczos4Vec_32f16s> >, 0, resizeGeneric_
, VResizeLanczos4
, VResizeLanczos4Vec_32f> >, resizeGeneric_
, VResizeLanczos4
, VResizeNoVec> >, 0 }; static ResizeAreaFastFunc areafast_tab[] = { resizeAreaFast_
>, 0, resizeAreaFast_
>, resizeAreaFast_
>, 0, resizeAreaFast_
, resizeAreaFast_
>, 0 }; static ResizeAreaFunc area_tab[] = { resizeArea_
, 0, resizeArea_
, resizeArea_
, 0, resizeArea_
, resizeArea_
, 0 }; double scale_x = 1./inv_scale_x, scale_y = 1./inv_scale_y; int iscale_x = saturate_cast
(scale_x); int iscale_y = saturate_cast
(scale_y); bool is_area_fast = std::abs(scale_x - iscale_x) < DBL_EPSILON && std::abs(scale_y - iscale_y) < DBL_EPSILON; Mat src(Size(src_width, src_height), src_type, const_cast
(src_data), src_step); Mat dst(dsize, src_type, dst_data, dst_step); if( interpolation == INTER_NEAREST ) { resizeNN( src, dst, inv_scale_x, inv_scale_y ); return; } int k, sx, sy, dx, dy; { // in case of scale_x && scale_y is equal to 2 // INTER_AREA (fast) also is equal to INTER_LINEAR if( interpolation == INTER_LINEAR && is_area_fast && iscale_x == 2 && iscale_y == 2 ) interpolation = INTER_AREA; // true "area" interpolation is only implemented for the case (scale_x <= 1 && scale_y <= 1). // In other cases it is emulated using some variant of bilinear interpolation if( interpolation == INTER_AREA && scale_x >= 1 && scale_y >= 1 ) { if( is_area_fast ) { int area = iscale_x*iscale_y; size_t srcstep = src_step / src.elemSize1(); AutoBuffer
_ofs(area + dsize.width*cn); int* ofs = _ofs; int* xofs = ofs + area; ResizeAreaFastFunc func = areafast_tab[depth]; CV_Assert( func != 0 ); for( sy = 0, k = 0; sy < iscale_y; sy++ ) for( sx = 0; sx < iscale_x; sx++ ) ofs[k++] = (int)(sy*srcstep + sx*cn); for( dx = 0; dx < dsize.width; dx++ ) { int j = dx * cn; sx = iscale_x * j; for( k = 0; k < cn; k++ ) xofs[j + k] = sx + k; } func( src, dst, ofs, xofs, iscale_x, iscale_y ); return; } ResizeAreaFunc func = area_tab[depth]; CV_Assert( func != 0 && cn <= 4 ); AutoBuffer
_xytab((src_width + src_height)*2); DecimateAlpha* xtab = _xytab, *ytab = xtab + src_width*2; int xtab_size = computeResizeAreaTab(src_width, dsize.width, cn, scale_x, xtab); int ytab_size = computeResizeAreaTab(src_height, dsize.height, 1, scale_y, ytab); AutoBuffer
_tabofs(dsize.height + 1); int* tabofs = _tabofs; for( k = 0, dy = 0; k < ytab_size; k++ ) { if( k == 0 || ytab[k].di != ytab[k-1].di ) { assert( ytab[k].di == dy ); tabofs[dy++] = k; } } tabofs[dy] = ytab_size; func( src, dst, xtab, xtab_size, ytab, ytab_size, tabofs ); return; } } int xmin = 0, xmax = dsize.width, width = dsize.width*cn; bool area_mode = interpolation == INTER_AREA; bool fixpt = depth == CV_8U; float fx, fy; ResizeFunc func=0; int ksize=0, ksize2; if( interpolation == INTER_CUBIC ) ksize = 4, func = cubic_tab[depth]; else if( interpolation == INTER_LANCZOS4 ) ksize = 8, func = lanczos4_tab[depth]; else if( interpolation == INTER_LINEAR || interpolation == INTER_AREA ) ksize = 2, func = linear_tab[depth]; else CV_Error( CV_StsBadArg, "Unknown interpolation method" ); ksize2 = ksize/2; CV_Assert( func != 0 ); AutoBuffer
_buffer((width + dsize.height)*(sizeof(int) + sizeof(float)*ksize)); int* xofs = (int*)(uchar*)_buffer; int* yofs = xofs + width; float* alpha = (float*)(yofs + dsize.height); short* ialpha = (short*)alpha; float* beta = alpha + width*ksize; short* ibeta = ialpha + width*ksize; float cbuf[MAX_ESIZE] = {0}; for( dx = 0; dx < dsize.width; dx++ ) { if( !area_mode ) { fx = (float)((dx+0.5)*scale_x - 0.5); sx = cvFloor(fx); fx -= sx; } else { sx = cvFloor(dx*scale_x); fx = (float)((dx+1) - (sx+1)*inv_scale_x); fx = fx <= 0 ? 0.f : fx - cvFloor(fx); } if( sx < ksize2-1 ) { xmin = dx+1; if( sx < 0 && (interpolation != INTER_CUBIC && interpolation != INTER_LANCZOS4)) fx = 0, sx = 0; } if( sx + ksize2 >= src_width ) { xmax = std::min( xmax, dx ); if( sx >= src_width-1 && (interpolation != INTER_CUBIC && interpolation != INTER_LANCZOS4)) fx = 0, sx = src_width-1; } for( k = 0, sx *= cn; k < cn; k++ ) xofs[dx*cn + k] = sx + k; if( interpolation == INTER_CUBIC ) interpolateCubic( fx, cbuf ); else if( interpolation == INTER_LANCZOS4 ) interpolateLanczos4( fx, cbuf ); else { cbuf[0] = 1.f - fx; cbuf[1] = fx; } if( fixpt ) { for( k = 0; k < ksize; k++ ) ialpha[dx*cn*ksize + k] = saturate_cast
(cbuf[k]*INTER_RESIZE_COEF_SCALE); for( ; k < cn*ksize; k++ ) ialpha[dx*cn*ksize + k] = ialpha[dx*cn*ksize + k - ksize]; } else { for( k = 0; k < ksize; k++ ) alpha[dx*cn*ksize + k] = cbuf[k]; for( ; k < cn*ksize; k++ ) alpha[dx*cn*ksize + k] = alpha[dx*cn*ksize + k - ksize]; } } for( dy = 0; dy < dsize.height; dy++ ) { if( !area_mode ) { fy = (float)((dy+0.5)*scale_y - 0.5); sy = cvFloor(fy); fy -= sy; } else { sy = cvFloor(dy*scale_y); fy = (float)((dy+1) - (sy+1)*inv_scale_y); fy = fy <= 0 ? 0.f : fy - cvFloor(fy); } yofs[dy] = sy; if( interpolation == INTER_CUBIC ) interpolateCubic( fy, cbuf ); else if( interpolation == INTER_LANCZOS4 ) interpolateLanczos4( fy, cbuf ); else { cbuf[0] = 1.f - fy; cbuf[1] = fy; } if( fixpt ) { for( k = 0; k < ksize; k++ ) ibeta[dy*ksize + k] = saturate_cast
(cbuf[k]*INTER_RESIZE_COEF_SCALE); } else { for( k = 0; k < ksize; k++ ) beta[dy*ksize + k] = cbuf[k]; } } func( src, dst, xofs, fixpt ? (void*)ialpha : (void*)alpha, yofs, fixpt ? (void*)ibeta : (void*)beta, xmin, xmax, ksize );}} // cv::hal::} // cv::

 

转载地址:http://yorgi.baihongyu.com/

你可能感兴趣的文章
在项目中部署redis企业级数据备份方案以及各种踩坑的数据恢复容灾演练
查看>>
副本集的搭建
查看>>
【原创】boa服务移植到安卓手机
查看>>
msgrcv error : Identifier removed(ERMID)错误解决;
查看>>
Linux进程间通信——消息队列:
查看>>
linux内核——进程管理
查看>>
(原创)socket学习实验(一)——利用C 语言socket抓取一个网页内容
查看>>
Linux 同步方法剖析--内核原子,自旋锁和互斥锁
查看>>
adb shell中设置android系统内部环境变量!
查看>>
Android ADB中使用find命令
查看>>
(原创)android6.0系统Healthd深入分析
查看>>
(原创)Android6.0亮屏流程之Keyguard Window绘制
查看>>
你想成为Android高级工程师你还得学习Hook
查看>>
菜鸟带你Hook技术实战
查看>>
BAT面试题集锦——Java基础(一)
查看>>
BAT面试题集锦——Java基础(二)
查看>>
Retrofit原理解析最简洁的思路
查看>>
Okhttp的源码解读
查看>>
【Android P】 JobScheduler服务源码解析(二) ——框架解析
查看>>
【Android P】 JobScheduler服务源码解析(三)—— 使用Job需要注意的点
查看>>