日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

分别用Eigen和C++(OpenCV)实现图像(矩阵)转置

發布時間:2023/11/27 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分别用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)实现图像(矩阵)转置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。