实现opencv如下的函数,在pyramid lk算法中用到,其他地方也有用得到,单独拿出来。

代码共享在github:   https://github.com/tishi43/pyr_down


template<class CastOp, class VecOp> voidpyrDown_( const Mat& _src, Mat& _dst, int borderType ){const int PD_SZ = 5;typedef typename CastOp::type1 WT;typedef typename CastOp::rtype T;CV_Assert( !_src.empty() );Size ssize = _src.size(), dsize = _dst.size();int cn = _src.channels();int bufstep = (int)alignSize(dsize.width*cn, 16);AutoBuffer<WT> _buf(bufstep*PD_SZ + 16);WT* buf = alignPtr((WT*)_buf, 16);int tabL[CV_CN_MAX*(PD_SZ+2)], tabR[CV_CN_MAX*(PD_SZ+2)];AutoBuffer<int> _tabM(dsize.width*cn);int* tabM = _tabM;WT* rows[PD_SZ];CastOp castOp;VecOp vecOp;char path[64] = { 0 };int pyramid_level = 0;sprintf(path, "hor%d.txt", pyramid_level);fopen_s(&f_hor, path, "wb");sprintf(path, "ver%d.txt", pyramid_level);fopen_s(&f_ver, "ver.txt", "wb");CV_Assert( ssize.width > 0 && ssize.height > 0 &&std::abs(dsize.width*2 - ssize.width) <= 2 &&std::abs(dsize.height*2 - ssize.height) <= 2 );int k, x, sy0 = -PD_SZ/2, sy = sy0, width0 = std::min((ssize.width-PD_SZ/2-1)/2 + 1, dsize.width);for( x = 0; x <= PD_SZ+1; x++ ){int sx0 = borderInterpolate(x - PD_SZ/2, ssize.width, borderType)*cn;int sx1 = borderInterpolate(x + width0*2 - PD_SZ/2, ssize.width, borderType)*cn;for( k = 0; k < cn; k++ ){tabL[x*cn + k] = sx0 + k;tabR[x*cn + k] = sx1 + k;}}ssize.width *= cn;dsize.width *= cn;width0 *= cn;for( x = 0; x < dsize.width; x++ )tabM[x] = (x/cn)*2*cn + x % cn;for( int y = 0; y < dsize.height; y++ ){T* dst = _dst.ptr<T>(y);WT *row0, *row1, *row2, *row3, *row4;// fill the ring buffer (horizontal convolution and decimation)for( ; sy <= y*2 + 2; sy++ ){WT* row = buf + ((sy - sy0) % PD_SZ)*bufstep;int _sy = borderInterpolate(sy, ssize.height, borderType);const T* src = _src.ptr<T>(_sy);int limit = cn;const int* tab = tabL;for( x = 0;;){for( ; x < limit; x++ ){row[x] = src[tab[x+cn*2]]*6 + (src[tab[x+cn]] + src[tab[x+cn*3]])*4 +src[tab[x]] + src[tab[x+cn*4]];if (sy >= 0)Log_hor("y=%d x=%d conv=%d\n",sy,x,row[x]);}if( x == dsize.width )break;if( cn == 1 ){for (; x < width0; x++){row[x] = src[x * 2] * 6 + (src[x * 2 - 1] + src[x * 2 + 1]) * 4 +src[x * 2 - 2] + src[x * 2 + 2];if (sy >= 0)Log_hor("y=%d x=%d conv=%d\n",sy, x, row[x]);}}else if( cn == 3 ){for( ; x < width0; x += 3 ){const T* s = src + x*2;WT t0 = s[0]*6 + (s[-3] + s[3])*4 + s[-6] + s[6];WT t1 = s[1]*6 + (s[-2] + s[4])*4 + s[-5] + s[7];WT t2 = s[2]*6 + (s[-1] + s[5])*4 + s[-4] + s[8];row[x] = t0; row[x+1] = t1; row[x+2] = t2;}}else if( cn == 4 ){for( ; x < width0; x += 4 ){const T* s = src + x*2;WT t0 = s[0]*6 + (s[-4] + s[4])*4 + s[-8] + s[8];WT t1 = s[1]*6 + (s[-3] + s[5])*4 + s[-7] + s[9];row[x] = t0; row[x+1] = t1;t0 = s[2]*6 + (s[-2] + s[6])*4 + s[-6] + s[10];t1 = s[3]*6 + (s[-1] + s[7])*4 + s[-5] + s[11];row[x+2] = t0; row[x+3] = t1;}}else{for( ; x < width0; x++ ){int sx = tabM[x];row[x] = src[sx]*6 + (src[sx - cn] + src[sx + cn])*4 +src[sx - cn*2] + src[sx + cn*2];}}limit = dsize.width;tab = tabR - x;}}// do vertical convolution and decimation and write the result to the destination imagefor( k = 0; k < PD_SZ; k++ )rows[k] = buf + ((y*2 - PD_SZ/2 + k - sy0) % PD_SZ)*bufstep;row0 = rows[0]; row1 = rows[1]; row2 = rows[2]; row3 = rows[3]; row4 = rows[4];//x = vecOp(rows, dst, (int)_dst.step, dsize.width);x = 0;for (; x < dsize.width; x++){dst[x] = castOp(row2[x] * 6 + (row1[x] + row3[x]) * 4 + row0[x] + row4[x]);Log_ver("y=%d x=%d conv=%d cast=%d(0x%x)\n", y, x, row2[x] * 6 + (row1[x] + row3[x]) * 4 + row0[x] + row4[x]+128, dst[x], dst[x]);}}fclose(f_hor);fclose(f_ver);}

opencv 的pyramid down函数verilog实现相关推荐

  1. 【OpenCV】OpenCV中积分图函数与应用

    OpenCV中积分图函数与应用 参考资料 opencv 查找integral,目前网上大部分的资料来自于opencv https://docs.opencv.org/master/d7/d1b/gro ...

  2. opencv 学习:reshape函数

    在opencv中,reshape函数比较有意思,它既可以改变矩阵的通道数,又可以对矩阵元素进行序列化,非常有用的一个函数. 函数原型: C++: Mat Mat::reshape(int cn, in ...

  3. opencv中伪彩色applyColorMap函数(C++ / Python)

    opencv中伪彩色applyColorMap函数(C++ / Python) 翻译 2017年06月23日 15:34:12 标签: 1654

  4. opencv中的approxPolyDP函数和boundingRect函数

    opencv中的approxPolyDP函数和boundingRect函数说明 cv2.boundingRect 举例: import numpy as npimage=cv2.imread(&quo ...

  5. 使用opencv中的merge()函数为BGR图像添加alpha通道

    先上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # 图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 # 图像处理 ...

  6. 计算机视觉开源库OpenCV之绘制轮廓函数cv2.drawContours()介绍

    计算机视觉开源库OpenCV之绘制轮廓函数cv2.drawContours(),用于轮廓的绘制或填充. cv2.drawContours(image, contours, contourIdx, co ...

  7. 计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours()介绍

    计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours说明如下: 示例代码: #!/usr/bin/env python3import cv2image = cv2.imread( ...

  8. openCV中的findHomography函数分析以及RANSAC算法的详解(源代码分析)

    本文将openCV中的RANSAC代码全部挑选出来,进行分析和讲解,以便大家更好的理解RANSAC算法.代码我都试过,可以直接运行. 在计算机视觉和图像处理等很多领域,都需要用到RANSAC算法.op ...

  9. OpenCV 3.1 imwrite()函数写入异常问题解决方法

    OpenCV 3.1 imwrite()函数写入异常问题解决方法 最近配置了OpenCV3.1版本,按照2.x的习惯写了一个保存图片的代码(测试证明该代码在2.4.11下运行正常),但是在使用imwr ...

最新文章

  1. python opencv 中bmp转raw格式图片并展示
  2. 统一代码段与非一致代码段
  3. 【转】图形学基础之透视校正插值
  4. 【Luogu】P3950部落冲突(树链剖分)
  5. Github 优秀开源项目 Best Open Source Projects
  6. vue如何获取年月日_BootstrapVue——Vue和Bootstrap的相结合,构建响应式应用更简单...
  7. Starling 2D框架简介
  8. Python3——简单的UDP实例
  9. Mozilla 发布新 Firefox 用户信息反跟踪策略
  10. Scala函数使用可变参数
  11. linux|文本编辑
  12. 文件写入一行 、读取一行的工具类案例
  13. 2021全国大学生数学建模竞赛E题思路
  14. 前端传递数组给后端,多个相同key,对应不同值
  15. 基于PC-DIMS脱机软件 的海克斯康三坐标机脱机编程软件手册。
  16. 苹果电脑计算机找不到打印机,Mac_Mac怎么连接打印机?苹果电脑Mac打印机设置教程 ,Mac怎么连接打印机?Mac打印机 - phpStudy...
  17. 方差分解分析 (VPA):定量不同环境因子对群落变化的解释比例
  18. 豆瓣电影页面html代码,Vue.js 仿豆瓣电影DEMO 学习笔记一
  19. 资产管理业务和财富管理
  20. (python代码+讲解)重叠社区发现EAGLE层次算法的实现

热门文章

  1. javascript笔记知识(可能有错误、欢迎指正)
  2. C++大学教程(第二版)c++how to program Second Edition --电子工业出版社【美】harvey M.Deitel and paul James Deitel(更新中)
  3. 1006-奇怪的分式
  4. “世界杰出女科学家成就奖”组委会宣布2021年度五位获奖者
  5. 三七互娱-游戏运维岗笔试题(无答案)
  6. 实验6 8255并行接口实验【微机原理】【实验】
  7. 费舍尔方法 续:逆高斯法(Stouffer‘s Z-score method)
  8. vscode中使用prettier后html,css格式化不生效的问题
  9. 大龄程序员求职四处碰壁,不知今后该怎么办!网友:老码农有咩用
  10. SpringMVC使用HandlerExceptionResolver实现全局异常处理器