分别用Eigen和C++(OpenCV)实现图像(矩阵)转置
(1)、标量(scalar):一个标量就是一个单独的数。
(2)、向量(vector):一个向量是一列数,这些数是有序排列的,通过次序中的索引,可以确定每个单独的数。
(3)、矩阵(matrix):矩阵是一个二维数组,其中的每一个元素被两个索引而非一个所确定。
(4)、张量(tensor):在某些情况下,我们会讨论坐标超过两维的数组。一般地,一个数组中的元素分布在若干维坐标的规则网格中,我们将其称之为张量。
(5)、转置(transpose):矩阵的转置是以对角线为轴的镜像,这条从左上角到右下角的对角线被称为主对角线(main diagonal):
(AT)i,j = Aj,i
向量可以看作是只有一列的矩阵。对应地,向量的转置可以看作是只有一行的矩阵。有时,我们通过将向量元素作为行矩阵写在文本行中,然后使用转置操作将其变为标准的列向量,来定义一个向量。
标量可以看作是只有一个元素的矩阵。因此,标量的转置等于它本身。
以上内容摘自:《深度学习中文版》(https://github.com/exacity/deeplearningbook-chinese)
下面是用C+++OpenCVC实现的图像转置:
#include "funset.hpp"
#include <iostream>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>int test_mat_transpose()
{const std::vector<std::string> image_name{ "E:/GitCode/NN_Test/data/images/test1.jpg","E:/GitCode/NN_Test/data/images/ret_mat_transpose.jpg"};cv::Mat mat_src = cv::imread(image_name[0]);if (!mat_src.data) {fprintf(stderr, "read image fail: %s\n", image_name[0].c_str());return -1;}cv::Mat mat_dst(mat_src.cols, mat_src.rows, mat_src.type());for (int h = 0; h < mat_dst.rows; ++h) {for (int w = 0; w < mat_dst.cols; ++w) {const cv::Vec3b& s = mat_src.at<cv::Vec3b>(w, h);cv::Vec3b& d = mat_dst.at<cv::Vec3b>(h, w);d = s;}}cv::imwrite(image_name[1], mat_dst);return 0;
}
下面是用Eigen实现的图像转置:#include "funset.hpp"
#include <iostream>
#include <vector>
#include <string>
#include <opencv2/opencv.hpp>
#include <Eigen/Dense>int test_mat_transpose()
{const std::vector<std::string> image_name{ "E:/GitCode/Eigen_Test/test_data/test1.jpg","E:/GitCode/Eigen_Test/test_data/ret_mat_transpose.jpg" };cv::Mat mat_src = cv::imread(image_name[0]);if (!mat_src.data) {fprintf(stderr, "read image fail: %s\n", image_name[0].c_str());return -1;}std::vector<cv::Mat> mat_split;cv::split(mat_src, mat_split);// reference: http://stackoverflow.com/questions/14783329/opencv-cvmat-and-eigenmatrix// Map the OpenCV matrix with Eigen:Eigen::Map<Eigen::Matrix<unsigned char, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>map_b(mat_split[0].data, mat_split[0].rows, mat_split[0].cols),map_g(mat_split[1].data, mat_split[1].rows, mat_split[1].cols),map_r(mat_split[2].data, mat_split[2].rows, mat_split[2].cols);Eigen::Matrix<unsigned char, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>trans_b = map_b.transpose(),trans_g = map_g.transpose(),trans_r = map_r.transpose();cv::Matmat_dst_b(trans_b.rows(), trans_b.cols(), CV_8UC1, trans_b.data()),mat_dst_g(trans_g.rows(), trans_g.cols(), CV_8UC1, trans_g.data()),mat_dst_r(trans_r.rows(), trans_r.cols(), CV_8UC1, trans_r.data());std::vector<cv::Mat> mat_merge;mat_merge.push_back(std::move(mat_dst_b));mat_merge.push_back(std::move(mat_dst_g));mat_merge.push_back(std::move(mat_dst_r));cv::Mat mat_dst;cv::merge(mat_merge, mat_dst);cv::imwrite(image_name[1], mat_dst);return 0;
}
经测试两种方法实现的结果是一致的,原图如下: https://github.com/fengbingchun/NN_Test
https://github.com/fengbingchun/Eigen_Test
相关文章:

Linux基础优化
***************************************************************************************linux系统的优化有很多,我简单阐述下我经常优化的方针:记忆口诀:***********************一清、一精、一增;两优、四设、七其他。*****…
数据集cifar10到Caffe支持的lmdb/leveldb转换的实现
在 http://blog.csdn.net/fengbingchun/article/details/53560637 对数据集cifar10进行过介绍,它是一个普通的物体识别数据集。为了使用Caffe对cifar10数据集进行train,下面实现了将cifar10到lmdb/leveldb的转换实现:#include "funset.h…

计算两个时间的间隔时间是多少
/*** 计算两个时间间隔* param startTime 开始时间* param endTime 结束时间* param type 类型(1:相隔小时 2:)* return*/public static int compareTime(String startTime, String endTime, int type) {if (endTime nul…

作为西二旗程序员,我是这样学习的.........
作为一名合格的程序员,需要时刻保持对新技术的敏感度,并且要定期更新自己的技能储备,是每个技术人的日常必修课。但要做到这一点,知乎上的网友说最高效的办法竟然是直接跟 BAT 等一线大厂取经。讲真的,BAT大厂的平台是…

2月国内搜索市场:360继续上升 百度下降0.62%
IDC评述网(idcps.com)03月06日报道:根据CNZZ数据显示,在国内搜索引擎市场中,百度在2014年2月份所占的份额继续被蚕食,环比1月份,下降了0.62%,为60.50%。与此相反,360搜索…

不止于刷榜,三大CV赛事夺冠算法技术的“研”与“用”
(由AI科技大本营付费下载自视觉中国)整理 | Jane出品 | AI科技大本营(ID:rgznai100)在 5 个月时间里(5月-9月),创新工场旗下人工智能企业创新奇智连续在世界顶级人脸检测竞赛 WIDER …
Ubuntu14.04上编译指定版本的protobuf源码操作步骤
Google Protobuf的介绍可以参考 http://blog.csdn.net/fengbingchun/article/details/49977903 ,这里介绍在Ubuntu14.04上编译安装指定版本的protobuf的操作步骤,这里以2.4.1为例:1. Ubuntu14.04上默认安装的是2.5.0,…

Linux下,各种解压缩命令集合
Linux下,各种解压缩命令集合tar xvfj lichuanhua.tar.bz2tar xvfz lichuanhua.tar.gztar xvfz lichuanhua.tgztar xvf lichuanhua.tarunzip lichuanhua.zip.gz解压 1:gunzip FileName.gz解压 2:gzip -d FileName.gz压缩:gzip File…
gtest使用初级指南
之前在 http://blog.csdn.net/fengbingchun/article/details/39667571 中对google的开源库gtest进行过介绍,现在看那篇博文,感觉有些没有说清楚,这里再进行总结下:Google Test是Google的开源C单元测试框架,简称gtest。…

iOS视频流采集概述(AVCaptureSession)
需求:需要采集到视频帧数据从而可以进行一系列处理(如: 裁剪,旋转,美颜,特效....). 所以,必须采集到视频帧数据. 阅读前提: 使用AVFoundation框架采集音视频帧数据GitHub地址(附代码) : iOS视频流采集概述 简书地址 : iOS视频流采…

300秒搞定第一超算1万年的计算量,量子霸权时代已来?
(由AI科技大本营付费下载自视觉中国)作者 | 马超责编 | 郭芮来源 | CSDN 博客近日,美国航天局(NASA)发布了一篇名为《Quantum Supremacy Using a Programmable Superconducting Processor》的报道,称谷歌的…

2014-3-6 星期四 [第一天执行分析]
昨日进度: [毛思想]:看测控技术量待定 --> [良]超额完成,昨天基本上把测控看了一大半啦 [汇编]:认真听课,边听边消化自学 --> [中]基本满足,还需要抽时间总结,特别是前面寻址的各种情况…
行列式介绍及Eigen/OpenCV/C++的三种实现
行列式,记作det(A),是一个将方阵A映射到实数的函数。行列式等于矩阵特征值的乘积。行列式的绝对值可以用来衡量矩阵参与矩阵乘法后空间扩大或者缩小了多少。如果行列式是0,那么空间至少沿着某一维完全收缩了,使其失去了所有的体积…

基于Go的语义解析开源库FMR,“屠榜”模型外的NLP利器
(由AI科技大本营付费下载自视觉中国)作者 | 刘占亮 一览群智技术副总裁编辑 | Jane出品 | AI科技大本营(ID:rgznai100)如何合理地表示语言的内在意义?这是自然语言处理业界中长久以来悬而未决的一个命题。在…

【高级数据类型2】- 10. 接口
2019独角兽企业重金招聘Python工程师标准>>> Go语言-接口 在Go语言中,一个接口类型总是代表着某一种类型(即所有实现它的类型)的行为。一个接口类型的声明通常会包含关键字type、类型名称、关键字interface以及由花括号包裹的若干…

Linux软件包命令
2019独角兽企业重金招聘Python工程师标准>>> dpkg命令: dpkg -i **/**.deb 安装软件 dpkg -x **.deb 解开.deb文件 dpkg -r /-p 删除并清配置 更详细的 用dpkg --help 查询 如下: dpkg -i|--install <.deb 文件的文件名> ... | -R|--re…
Caffe中计算图像均值的实现(cifar10)
在深度学习中,在进行test时经常会减去train数据集的图像均值,这样做的好处是:属于数据预处理中的数据归一化,降低数据间相似性,可以将数值调整到一个合理的范围。以下code是用于计算cifar10中训练集的图像均值…

阿里云弹性公网IP(EIP)的使用限制
阿里云弹性公网IP(EIP)是一种可以独立购买和持有的公网IP地址资源,弹性公网IP具有独立购买持有、弹性绑定和配置灵活等优势,但实际使用中弹性公网IP也是有很多限制的,阿里云惠网分享弹性公网IP(EIP…

400名微软员工主动曝光薪资:28万元到228万元不等!
作者 | Dave Gershgorn译者 | 弯月,编辑 | 郭芮来源 | CSDN(ID:CSDNnews)【导读】近日,近400名微软员工分享了他们的薪酬(从4万美元到32万美元不等,约为28万人民币到228万人民币)&am…

Extjs:添加查看全部按钮
var grid new Ext.grid.GridPanel({renderTo:tsllb,title:产品成本列表,selModel:csm,height:350,columns:[csm,{header: "编码", dataIndex: "bm", sortable: true,hidden:true},{header: "产品", dataIndex: "cp", sortable: true},…

练手扎实基本功必备:非结构文本特征提取方法
作者 | Dipanjan (DJ) Sarkar编译 | ronghuaiyang来源 | AI公园(ID:AI_Paradise)【导读】本文介绍了一些传统但是被验证是非常有用的,现在都还在用的策略,用来对非结构化的文本数据提取特征。介绍在本文中,我们将研究如…
范数介绍及C++/OpenCV/Eigen的三种实现
有时我们需要衡量一个向量的大小。在机器学习中,我们经常使用被称为范数(norm)的函数衡量向量大小。形式上,Lp范数定义如下:范数(包括Lp范数)是将向量映射到非负值的函数。直观上来说,向量x的范数衡量从原点到点x的距离。更严格地…

js添加网页水印和three.js场景中加水印
我们在日常网页开发的时候,可能想给自己的网页或者canvas里面添加水印,增添个人标记,我这里分为普通静态html页面和threejs中3d场景里面添加水印功能。一 静态html页面添加水印你只需要在你的页面添加一个图片遮罩,通过绝对定位和…

JAVA学习笔记(6)
关于多线程的优先级,这个程序里面,现在计算机比较好,int存储不下了,我跑了好几次都是负分,特把int改成long。但是之后跑出来的结果,两个数字都差不多,不知道是什么问题?等待答案中。…

C++/C++11中std::deque的使用
std::deque是双端队列,可以高效的在头尾两端插入和删除元素,在std::deque两端插入和删除并不会使其它元素的指针或引用失效。在接口上和std::vector相似。与sdk::vector相反,std::deque中的元素并非连续存储:典型的实现是使用一个…

贾扬清:我对人工智能方向的一点浅见
阿里妹导读:作为 AI 大神,贾扬清让人印象深刻的可能是他写的AI框架Caffe ,那已经是六年前的事了。经过多年的沉淀,成为“阿里新人”的他,对人工智能又有何看法?最近,贾扬清在阿里内部分享了他的…

吴甘沙:天外飞“厕”、红绿灯消失,未来无人驾驶将被重新定义
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)2019 年9 月 5 日至 7 日,由新一代人工智能产业技术创新战略联盟(AITISA)指导,鹏城实验室、北京智源人工智能研究院支持,专业中文 IT 技术社区 CS…

Linux内核--网络栈实现分析(二)--数据包的传递过程--转
转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”…

C++/C++11中std::stack的使用
栈stack 是一个容器适配器(container adaptor)类型,被特别设计用来运行于LIFO(Last-in First-out,后进先出)场景,在该场景中,只能从容器末尾添加和删除元素,其定义在stack头文件中。stack默认基于std::deque实现&#…

团队前四次作业——个人总结
团队前四次作业——个人总结 描述 团队名称待就业六人组相关团队第四次作业答辩——反思与总结做了哪些事?工作量、完成度 作业负责工作量完成度团队队员展示创意合照后期1h95%项目选题报告编写创新和收益部分2h85%项目原型设计原型设计6h95%需求规格说明书功能需求…