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

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

实现代码transpose.hpp:

// fbc_cv is free software and uses the same licence as OpenCV
// Email: fengbingchun@163.com#ifndef FBC_CV_TRANSPOSE_HPP_
#define FBC_CV_TRANSPOSE_HPP_/* reference: include/opencv2/core.hppmodules/core/src/matrix.cpp
*/#include <typeinfo>
#include "core/mat.hpp"namespace fbc {// transposes the matrix
// \f[\texttt{dst} (i,j) =  \texttt{src} (j,i)\f]
// support type: uchar/float, multi-channels
template <typename _Tp, int chs>
int transpose(const Mat_<_Tp, chs>& src, Mat_<_Tp, chs>& dst)
{FBC_Assert(typeid(uchar).name() == typeid(_Tp).name() || typeid(float).name() == typeid(_Tp).name()); // uchar || floatif (dst.empty()) {dst = Mat_<_Tp, chs>(src.cols, src.rows);} else {FBC_Assert(src.rows == dst.cols && src.cols == dst.rows);}if (src.empty()) {dst.release();return 0;}// handle the case of single-column/single-row matrices, stored in STL vectors.if (src.rows != dst.cols || src.cols != dst.rows) {FBC_Assert(src.size() == dst.size() && (src.cols == 1 || src.rows == 1));src.copyTo(dst);return 0;}if (dst.data == src.data) {FBC_Assert(dst.cols == dst.rows);int n = dst.rows;int  step = dst.step;uchar* data = dst.ptr();for (int i = 0; i < n; i++) {_Tp* row = (_Tp*)(data + step*i);int i_ = i * chs;for (int j = i + 1; j < n; j++) {_Tp* data1 = (_Tp*)(data + step * j);int j_ = j * chs;for (int ch = 0; ch < chs; ch++) {std::swap(row[j_ + ch], data1[i_ + ch]);}}}} else {const uchar* src_ = src.ptr();size_t sstep = src.step;uchar* dst_ = dst.ptr();size_t dstep = dst.step;int m = src.cols, n = src.rows;for (int i = 0; i < n; i++) {const _Tp* s = (const _Tp*)(src_ + sstep*i);int i_ = i * chs;for (int j = 0; j < m; j++) {_Tp* d = (_Tp*)(dst_ + dstep*j);int j_ = j * chs;for (int ch = 0; ch < chs; ch++) {d[i_ + ch] = s[j_ + ch];}}}}return 0;
}} // namespace fbc#endif // FBC_CV_TRANSPOSE_HPP_

测试代码test_transpose.cpp:

#include "test_transpose.hpp"
#include <assert.h>
#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>
#include <transpose.hpp>int test_transpose_uchar()
{cv::Mat matSrc = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!matSrc.data) {std::cout << "read image fail" << std::endl;return -1;}int width = matSrc.cols;int height = matSrc.rows;cv::Mat matSrc_;cv::resize(matSrc, matSrc_, cv::Size(width, width));fbc::Mat_<uchar, 3> mat1(width, width);memcpy(mat1.data, matSrc_.data, width * width * 3);fbc::transpose(mat1, mat1);cv::Mat mat1_(width, width, CV_8UC3);memcpy(mat1_.data, matSrc_.data, width * width * 3);cv::transpose(mat1_, mat1_);assert(mat1.rows == mat1_.rows && mat1.cols == mat1_.cols && mat1.step == mat1_.step);for (int y = 0; y < mat1.rows; y++) {const fbc::uchar* p1 = mat1.ptr(y);const uchar* p2 = mat1_.ptr(y);for (int x = 0; x < mat1.step; x++) {assert(p1[x] == p2[x]);}}cv::Mat matSave(width, width, CV_8UC3, mat1.data);cv::imwrite("E:/GitCode/OpenCV_Test/test_images/transpose_fbc.jpg", matSave);cv::imwrite("E:/GitCode/OpenCV_Test/test_images/transpose_cv.jpg", mat1_);cv::Mat matSrc1 = cv::imread("E:/GitCode/OpenCV_Test/test_images/1.jpg", 1);if (!matSrc1.data) {std::cout << "read image fail" << std::endl;return -1;}width = matSrc1.cols;height = matSrc1.rows;fbc::Mat_<uchar, 3> mat2(height, width, matSrc1.data);fbc::Mat_<uchar, 3> mat3(width, height);fbc::transpose(mat2, mat3);cv::Mat mat2_(height, width, CV_8UC3, matSrc1.data);cv::Mat mat3_;cv::transpose(mat2_, mat3_);assert(mat3.rows == mat3_.rows && mat3.cols == mat3_.cols && mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p1 = mat3.ptr(y);const uchar* p2 = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p1[x] == p2[x]);}}cv::Mat matSave1(width, height, CV_8UC3, mat3.data);cv::imwrite("E:/GitCode/OpenCV_Test/test_images/transpose1_fbc.jpg", matSave1);cv::imwrite("E:/GitCode/OpenCV_Test/test_images/transpose1_cv.jpg", mat3_);return 0;
}int test_transpose_float()
{cv::Mat matSrc = cv::imread("E:/GitCode/OpenCV_Test/test_images/lena.png", 1);if (!matSrc.data) {std::cout << "read image fail" << std::endl;return -1;}cv::cvtColor(matSrc, matSrc, CV_BGR2GRAY);matSrc.convertTo(matSrc, CV_32FC1);int width = matSrc.cols;int height = matSrc.rows;cv::Mat matSrc_;cv::resize(matSrc, matSrc_, cv::Size(width, width));fbc::Mat_<float, 1> mat1(width, width);memcpy(mat1.data, matSrc_.data, width * width * sizeof(float));fbc::transpose(mat1, mat1);cv::Mat mat1_(width, width, CV_32FC1);memcpy(mat1_.data, matSrc_.data, width * width * sizeof(float));cv::transpose(mat1_, mat1_);assert(mat1.rows == mat1_.rows && mat1.cols == mat1_.cols && mat1.step == mat1_.step);for (int y = 0; y < mat1.rows; y++) {const fbc::uchar* p1 = mat1.ptr(y);const uchar* p2 = mat1_.ptr(y);for (int x = 0; x < mat1.step; x++) {assert(p1[x] == p2[x]);}}cv::Mat matSrc1 = cv::imread("E:/GitCode/OpenCV_Test/test_images/1.jpg", 1);if (!matSrc1.data) {std::cout << "read image fail" << std::endl;return -1;}cv::cvtColor(matSrc1, matSrc1, CV_BGR2GRAY);matSrc1.convertTo(matSrc1, CV_32FC1);width = matSrc1.cols;height = matSrc1.rows;fbc::Mat_<float, 1> mat2(height, width, matSrc1.data);fbc::Mat_<float, 1> mat3(width, height);fbc::transpose(mat2, mat3);cv::Mat mat2_(height, width, CV_32FC1, matSrc1.data);cv::Mat mat3_;cv::transpose(mat2_, mat3_);assert(mat3.rows == mat3_.rows && mat3.cols == mat3_.cols && mat3.step == mat3_.step);for (int y = 0; y < mat3.rows; y++) {const fbc::uchar* p1 = mat3.ptr(y);const uchar* p2 = mat3_.ptr(y);for (int x = 0; x < mat3.step; x++) {assert(p1[x] == p2[x]);}}return 0;
}

GitHub:https://github.com/fengbingchun/OpenCV_Test

OpenCV代码提取:transpose函数的实现相关推荐

  1. OpenCV代码提取:cvtColor函数的实现

    OpenCV中的cvtColor函数包括了很多颜色格式之间的转换,用起来很方便,这里对cvtColor函数的code进行了提取,经测试,和OpenCV3.1结果完全一致. 实现代码cvtColor.h ...

  2. 图像处理库(fbc_cv):源自OpenCV代码提取

    在实际项目中会经常用到一些基本的图像处理操作,而且经常拿OpenCV进行结果对比,因此这里从OpenCV中提取了一些代码组织成fbc_cv库.项目fbc_cv所有的代码已放到GitHub中,地址为   ...

  3. OpenCV代码提取:resize函数的实现

    之前在http://blog.csdn.net/fengbingchun/article/details/17335477 中有过对cv::resize函数五种插值算法的介绍.这里将OpenCV3.1 ...

  4. OpenCV代码提取:flip函数的实现

    OpenCV中实现图像翻转的函数flip,公式为: 目前fbc_cv库中也实现了flip函数,支持多通道,uchar和float两种数据类型,经测试,与OpenCV3.1结果完全一致. 实现代码fli ...

  5. OpenCV代码提取:rotate函数的实现

    OpenCV中并没有直接提供实现rotate的函数,这里通过getRotationMatrix2D和warpAffine函数实现rotate,并增加了一个crop参数,用来判断是否进行crop.目前支 ...

  6. OpenCV代码提取:merge/split函数的实现

    对OpenCV中的merge/split函数进行了实现,经测试,与OpenCV3.1结果完全一致. merge实现代码merge.hpp: // fbc_cv is free software and ...

  7. OpenCV代码提取:遍历指定目录下指定文件的实现

    OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便.但是在最新的OpenCV 3.1版本给去除掉了.为了以后使用方便,这里将OpenCV 2.4.9中相关的函数 ...

  8. OpenCV代码提取:Windows上通过DShow获取Camera视频

    在OpenCV 3.1中获取视频的模块在videoio(video input and output module)中,调用VideoCapture类接口,除了videoio模块外还依赖core.hi ...

  9. OpenCV 中的 remap 函数

    上一篇文章中提到 warpAffine 会分块处理,将坐标映射和插值系数分别存储下来,然后借助 remap 来实现最终的映射.而 remap 会根据映射关系取源像素并加权计算出目的像素值.其最核心的计 ...

最新文章

  1. MyBatis配置项--properties
  2. 英语语法---分词短语详解
  3. 优秀!本科生发表Nature论文,直博美国顶尖名校
  4. linux通过时间查询日志,linux按时间查询日志
  5. oracle 函数 abs,Oracle 函数(八)
  6. SpringBoot整合Redis代码相关配置
  7. SpringBoot集成mybatis拦截器修改表名
  8. 如何升级win10.
  9. nginx 连接php
  10. Boost 之 lexical_cast
  11. Google Earth Engine APP ——Forest Health监测APP(可下载)
  12. markdown 不等于
  13. 账户结构,推广计划,推广单元
  14. 第9周 Python计算生态概览
  15. js版ffmpeg压缩视频以及去除背景音乐
  16. 如何运用Knald烘焙纹理来快速呈现材质纹理细节!
  17. node.js -v15.0.0下载安装配置教程笔记
  18. 初学者友好!10个有趣且易上手的AI项目(附Python源代码)
  19. 文献阅读笔记 # Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks
  20. 讯飞-糖尿病遗传风险检测挑战赛

热门文章

  1. 单片机I/O控制方式(UART中断和DMA中断的区别)
  2. 基于C++Opencv的傅里叶变换代码
  3. ncurse界面编程多线程示例
  4. UE虚幻引擎:建筑可视化学习教程 Unreal Engine : Architectural Visualization
  5. Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用)
  6. 【牛客网】最长对称子串
  7. Y15BeTa蜂鸣器唱歌程序-演奏版
  8. RabbitMQ 异常与任务分发
  9. HDU-2084 数塔 经典dp,水
  10. SQL查询语句 select 详解