aihot  2017-05-16 22:10:52  OpenCV |   查看评论   

  OpenCV中的transpose函数实现图像转置,公式为:

OpenCV代码提取:transpose函数的实现

目前fbc_cv库中也实现了transpose函数,支持多通道,uchar和float两种数据类型,经测试,与OpenCV3.1结果完全一致。

实现代码transpose.hpp:

  1. // fbc_cv是免费软件,并且使用与OpenCV相同的许可证
  2.   
  3. #ifndef FBC_CV_TRANSPOSE_HPP_  
  4. #define FBC_CV_TRANSPOSE_HPP_  
  5.   
  6. /* 参考: include/opencv2/core.hpp 
  7.               modules/core/src/matrix.cpp 
  8. */  
  9.   
  10. #include <typeinfo>  
  11. #include "core/mat.hpp"  
  12.   
  13. namespace fbc {  
  14.   
  15. // 转置矩阵 
  16. // \f[\texttt{dst} (i,j) =  \texttt{src} (j,i)\f]  
  17. // 支持类型:uchar/float,多通道  
  18. template <typename _Tp, int chs>  
  19. int transpose(const Mat_<_Tp, chs>& src, Mat_<_Tp, chs>& dst)  
  20. {  
  21.     FBC_Assert(typeid(uchar).name() == typeid(_Tp).name() || typeid(float).name() == typeid(_Tp).name()); // uchar || float  
  22.     if (dst.empty()) {  
  23.         dst = Mat_<_Tp, chs>(src.cols, src.rows);  
  24.     } else {  
  25.         FBC_Assert(src.rows == dst.cols && src.cols == dst.rows);  
  26.     }  
  27.   
  28.     if (src.empty()) {  
  29.         dst.release();  
  30.         return 0;  
  31.     }  
  32.   
  33.     // 处理存储在STL向量中的单列/单行矩阵的情况.  
  34.     if (src.rows != dst.cols || src.cols != dst.rows) {  
  35.         FBC_Assert(src.size() == dst.size() && (src.cols == 1 || src.rows == 1));  
  36.         src.copyTo(dst);  
  37.         return 0;  
  38.     }  
  39.   
  40.     if (dst.data == src.data) {  
  41.         FBC_Assert(dst.cols == dst.rows);  
  42.         int n = dst.rows;  
  43.         int  step = dst.step;  
  44.         uchar* data = dst.ptr();  
  45.   
  46.         for (int i = 0; i < n; i++) {  
  47.             _Tp* row = (_Tp*)(data + step*i);  
  48.             int i_ = i * chs;  
  49.   
  50.             for (int j = i + 1; j < n; j++) {  
  51.                 _Tp* data1 = (_Tp*)(data + step * j);  
  52.                 int j_ = j * chs;  
  53.   
  54.                 for (int ch = 0; ch < chs; ch++) {  
  55.                     std::swap(row[j_ + ch], data1[i_ + ch]);  
  56.                 }  
  57.             }  
  58.         }  
  59.     } else {  
  60.         const uchar* src_ = src.ptr();  
  61.         size_t sstep = src.step;  
  62.         uchar* dst_ = dst.ptr();  
  63.         size_t dstep = dst.step;  
  64.         int m = src.cols, n = src.rows;  
  65.   
  66.         for (int i = 0; i < n; i++) {  
  67.             const _Tp* s = (const _Tp*)(src_ + sstep*i);  
  68.             int i_ = i * chs;  
  69.   
  70.             for (int j = 0; j < m; j++) {  
  71.                 _Tp* d = (_Tp*)(dst_ + dstep*j);  
  72.                 int j_ = j * chs;  
  73.   
  74.                 for (int ch = 0; ch < chs; ch++) {  
  75.                     d[i_ + ch] = s[j_ + ch];  
  76.                 }  
  77.             }  
  78.         }  
  79.     }  
  80.   
  81.     return 0;  
  82. }  
  83.   
  84. // 命名空间fbc 
  85.   
  86. #endif // FBC_CV_TRANSPOSE_HPP_  

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自OpenCV代码提取:transpose函数的实现

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]