分别用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;
}
經測試兩種方法實現的結果是一致的,原圖如下:
結果如下:
GitHub:
https://github.com/fengbingchun/NN_Test
https://github.com/fengbingchun/Eigen_Test
總結
以上是生活随笔為你收集整理的分别用Eigen和C++(OpenCV)实现图像(矩阵)转置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中std::sort/std::s
- 下一篇: 数据集cifar10到Caffe支持的l