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.hpp
modules/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 || float
if (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代码提取:flip函数的实现
OpenCV中实现图像翻转的函数flip,公式为: 目前fbc_cv库中也实现了flip函数,支持多通道,uchar和float两种数据类型,经测试,与OpenCV3.1结果完全一致. 实现代码fli ...
- OpenCV代码提取:dft函数的实现
The Fourier Transform will decompose an image into its sinus and cosines components. In other words, ...
- OpenCV代码提取: threshold函数的实现
threshold algorithm: The simplest image segmentation method. All thresholding algorithms take a sour ...
- OpenCV代码提取:遍历指定目录下指定文件的实现
前言 OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便.但是在最新的OpenCV 3.1版本给去除掉了.为了以后使用方便,这里将OpenCV 2.4.9中相关 ...
- OpenCV中的绘图函数-OpenCV步步精深
OpenCV 中的绘图函数 画线 首先要为画的线创造出环境,就要生成一个空的黑底图像 img=np.zeros((512,512,3), np.uint8) 这是黑色的底,我们的画布,我把窗口名叫做i ...
- 基础学习笔记之opencv(24):imwrite函数的使用
http://www.cnblogs.com/tornadomeet/archive/2012/12/26/2834336.html 前言 OpenCV中保存图片的函数在c++版本中变成了imwrit ...
- tf.transpose函数解析
tf.transpose函数解析 觉得有用的话,欢迎一起讨论相互学习~Follow Me tf.transpose(a, perm = None, name = 'transpose') 解释 将a进 ...
- (转)Uri详解之——Uri结构与代码提取
前言:依然没有前言…… 相关博客:1.<Uri详解之——Uri结构与代码提取>2.<Uri详解之二——通过自定义Uri外部启动APP与Notification启动> 上几篇给大 ...
- Uri详解之——Uri结构与代码提取
目录(?)[+] 前言:依然没有前言…… 相关博客:1.<Uri详解之——Uri结构与代码提取>2.<Uri详解之二——通过自定义Uri外部启动APP与Notification启动& ...
随机推荐
- vue.js--基础 数据的双向绑定
所谓双向绑定:就是改变modle,就会改变view,改变view,也会改变modle 下面案例,点击getMthod(),获取msg的内容,在点击setMthod()改变msg的内容,你会发现H1的值 ...
- OpenCV人脸识别
import cv2 filename = 'pic.jpg' def detect(filename): face_cascade = cv2.CascadeClassifier('./haarca ...
- Spring data jpa命名规范
JPA命名规范 (sample与JPQL等效) Table 4. Supported keywords inside method names Keyword Sample JPQL snippet ...
- Openresty最佳案例 | 汇总
转载请标明出处: http://blog.csdn.net/forezp/article/details/78616856 本文出自方志朋的博客 目录 Openresty最佳案例 | 第1篇:Ngin ...
- Python 学习笔记(七)Python字符串(二)
索引和切片 索引 是从0开始计数:当索引值为负数时,表示从最后一个元素(从右到左)开始计数 切片 用于截取某个范围内的元素,通过:来指定起始区间(左闭右开区间,包含左侧索引值对应的元素,但不包含右测 ...
- Django-rest-framework(七)swagger使用
在我们接口开发完之后,需要交付给别人对接,在没有使用swagger的时候,我们需要单独编写一份api接口文档,由postman之类的工具进行请求得到返回的结果.而有了swagger之后,可以通过提取接 ...
- 使用RMAN对数据文件进行恢复
(1)备份数据库 在使用RMAN进行数据库恢复之前,先用RMAN进行全库备份 [oracle@redhat6 ~]$ rman target / Recovery Manager: Release : ...
- vi常用命令学习
(1)移动光标 h : 左移光标l : 右移光标j : 下移光标k : 上移光标 w : 移动到下一个单词词头b : 移动到上一个单词词头e : 移动到本单词的尾部 0 :移动到当前行的开端$ :移动 ...
- Showing All Messages : error: open /Users/apple/Library/Developer/Xcode/DerivedData/xxx-dkhmpttmnuppvbcxijlcxacfpzcl/Build/Products/Debug-iphoneos/xxx.app/EaseUIResource.bundle/arrow@2x.png: N
2报错 Showing All Messages : error: open /Users/apple/Library/Developer/Xcode/DerivedData/xxx-dkhmpttm ...
- Lucene的原理和应用
随着互联网的迅速普及与发展,网络舆论对社会生活的影响力越来越大, 网络口碑研究也逐渐形成一个新兴行业.有效的网络口碑研究,需要全方位地倾听网民的声音. 信息检索技术的应用,有效地提高了网络口碑研究的工 ...