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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發布時間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV代码提取:transpose函数的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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函数的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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

歡迎分享!

轉載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:OpenCV代码提取:transpose函数的实现