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

歡迎訪問 生活随笔!

生活随笔

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

生活经验

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

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

OpenCV中實現圖像翻轉的函數flip,公式為:


目前fbc_cv庫中也實現了flip函數,支持多通道,uchar和float兩種數據類型,經測試,與OpenCV3.1結果完全一致。

實現代碼flip.hpp:

// fbc_cv is free software and uses the same licence as OpenCV
// Email: fengbingchun@163.com#ifndef FBC_CV_FLIP_HPP_
#define FBC_CV_FLIP_HPP_/* reference: include/opencv2/core.hppmodules/core/src/copy.cpp
*/#include <typeinfo>
#include "core/mat.hpp"namespace fbc {template<typename _Tp, int chs> static int flipHoriz(const Mat_<_Tp, chs>& src, Mat_<_Tp, chs>& dst);
template<typename _Tp, int chs> static int flipVert(const Mat_<_Tp, chs>& src, Mat_<_Tp, chs>& dst);// Flips a 2D array around vertical, horizontal, or both axes
// flipCode: 0 means flipping around the x - axis and positive value means flipping around y - axis.
//	     Negative value means flipping around both axes
// support type: uchar/float, multi-channels
template <typename _Tp, int chs>
int flip(const Mat_<_Tp, chs>& src, Mat_<_Tp, chs>& dst, int flipCode)
{FBC_Assert(typeid(uchar).name() == typeid(_Tp).name() || typeid(float).name() == typeid(_Tp).name()); // uchar || floatif (dst.empty()) {dst = Mat_<_Tp, chs>(src.rows, src.cols);} else {FBC_Assert(src.rows == dst.rows && src.cols == dst.cols);}Size size = src.size();if (flipCode < 0) {if (size.width == 1)flipCode = 0;if (size.height == 1)flipCode = 1;}if ((size.width == 1 && flipCode > 0) ||(size.height == 1 && flipCode == 0) ||(size.height == 1 && size.width == 1 && flipCode < 0)) {src.copyTo(dst);return 0;}if (flipCode <= 0)flipVert(src, dst);elseflipHoriz(src, dst);if (flipCode < 0)flipHoriz(dst, dst);return 0;
}template<typename _Tp, int chs>
static int flipHoriz(const Mat_<_Tp, chs>& src, Mat_<_Tp, chs>& dst)
{Size size = src.size();size_t esz = sizeof(_Tp) * chs;int i, j, limit = (int)(((size.width + 1) / 2) *esz );AutoBuffer<int> _tab(size.width * esz);int* tab = _tab;size_t sstep = src.step;size_t dstep = dst.step;const uchar* src_ = src.ptr();uchar* dst_ = dst.ptr();for (i = 0; i < size.width; i++) {for (size_t k = 0; k < esz; k++) {tab[i*esz + k] = (int)((size.width - i - 1) * esz + k);}}for (; size.height--; src_ += sstep, dst_ += dstep) {for (i = 0; i < limit; i++) {j = tab[i];uchar t0 = src_[i], t1 = src_[j];dst_[i] = t1; dst_[j] = t0;}}return 0;
}template<typename _Tp, int chs>
static int flipVert(const Mat_<_Tp, chs>& src, Mat_<_Tp, chs>& dst)
{const uchar* src0 = src.ptr();uchar* dst0 = dst.ptr();Size size = src.size();size_t sstep = src.step;size_t dstep = dst.step;size_t esz = sizeof(_Tp) * chs;const uchar* src1 = src0 + (size.height - 1)*sstep;uchar* dst1 = dst0 + (size.height - 1)*dstep;size.width *= (int)esz;for (int y = 0; y < (size.height + 1) / 2; y++, src0 += sstep, src1 -= sstep, dst0 += dstep, dst1 -= dstep) {int i = 0;if (((size_t)src0 | (size_t)dst0 | (size_t)src1 | (size_t)dst1) % sizeof(int) == 0) {for (; i <= size.width - 16; i += 16) {int t0 = ((int*)(src0 + i))[0];int t1 = ((int*)(src1 + i))[0];((int*)(dst0 + i))[0] = t1;((int*)(dst1 + i))[0] = t0;t0 = ((int*)(src0 + i))[1];t1 = ((int*)(src1 + i))[1];((int*)(dst0 + i))[1] = t1;((int*)(dst1 + i))[1] = t0;t0 = ((int*)(src0 + i))[2];t1 = ((int*)(src1 + i))[2];((int*)(dst0 + i))[2] = t1;((int*)(dst1 + i))[2] = t0;t0 = ((int*)(src0 + i))[3];t1 = ((int*)(src1 + i))[3];((int*)(dst0 + i))[3] = t1;((int*)(dst1 + i))[3] = t0;}for (; i <= size.width - 4; i += 4) {int t0 = ((int*)(src0 + i))[0];int t1 = ((int*)(src1 + i))[0];((int*)(dst0 + i))[0] = t1;((int*)(dst1 + i))[0] = t0;}}for (; i < size.width; i++) {uchar t0 = src0[i];uchar t1 = src1[i];dst0[i] = t1;dst1[i] = t0;}}return 0;
}} // namespace fbc#endif // FBC_CV_FLIP_HPP_

測試代碼test_flip.cpp:

#include "test_flip.hpp"
#include <assert.h>
#include <iostream>
#include <string>#include <flip.hpp>
#include <opencv2/opencv.hpp>int test_flip_uchar()
{cv::Mat matSrc = cv::imread("E:/GitCode/OpenCV_Test/test_images/1.jpg", 1);if (!matSrc.data) {std::cout << "read image fail" << std::endl;return -1;}int width = matSrc.cols;int height = matSrc.rows;int flipCode[3] {-1, 0, 1}; // both axes, x axis, y axisfor (int i = 0; i < 3; i++) {fbc::Mat_<uchar, 3> mat1(height, width, matSrc.data);fbc::Mat_<uchar, 3> mat2(height, width);fbc::flip(mat1, mat2, flipCode[i]);cv::Mat mat1_(height, width, CV_8UC3, matSrc.data);cv::Mat mat2_;cv::flip(mat1_, mat2_, flipCode[i]);assert(mat2.rows == mat2_.rows && mat2.cols == mat2_.cols && mat2.step == mat2_.step);for (int y = 0; y < mat2.rows; y++) {const fbc::uchar* p1 = mat2.ptr(y);const uchar* p2 = mat2_.ptr(y);for (int x = 0; x < mat2.step; x++) {assert(p1[x] == p2[x]);}}std::string name = std::to_string(i);std::string file_path = "E:/GitCode/OpenCV_Test/test_images/";std::string name_fbc = file_path + "flip_fbc_" + name + ".jpg";std::string name_cv = file_path + "flip_cv_" + name + ".jpg";cv::Mat matSave(height, width, CV_8UC3, mat2.data);cv::imwrite(name_fbc, matSave);cv::imwrite(name_cv, mat2_);}return 0;
}int test_flip_float()
{cv::Mat matSrc = cv::imread("E:/GitCode/OpenCV_Test/test_images/1.jpg", 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;int flipCode[3] {-1, 0, 1}; // both axes, x axis, y axisfor (int i = 0; i < 3; i++) {fbc::Mat_<float, 1> mat1(height, width, matSrc.data);fbc::Mat_<float, 1> mat2(height, width);fbc::flip(mat1, mat2, flipCode[i]);cv::Mat mat1_(height, width, CV_32FC1, matSrc.data);cv::Mat mat2_;cv::flip(mat1_, mat2_, flipCode[i]);assert(mat2.rows == mat2_.rows && mat2.cols == mat2_.cols && mat2.step == mat2_.step);for (int y = 0; y < mat2.rows; y++) {const fbc::uchar* p1 = mat2.ptr(y);const uchar* p2 = mat2_.ptr(y);for (int x = 0; x < mat2.step; x++) {assert(p1[x] == p2[x]);}}}return 0;
}


GitHub: https://github.com/fengbingchun/OpenCV_Test

總結

以上是生活随笔為你收集整理的OpenCV代码提取:flip函数的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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

歡迎分享!

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

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

主站蜘蛛池模板: 亚洲无线观看 | 日韩午夜视频在线观看 | 视频毛片 | 精品视频免费观看 | 成人在线免费看片 | 搞中出 | 成人国产精品久久久网站 | 美女国产一区 | av一区二区三区在线观看 | 日本xxxx18| 国产三级直播 | wwxx日本| 成人网视频 | 国产伦精品一区二区三区照片 | www.欧美在线 | 中文字幕在线视频第一页 | xxxx 国产| 美女福利视频一区 | 美女激情网 | 偷拍女澡堂一区二区三区 | se在线观看| 伦一理一级一a一片 | 岛国色图 | 国产淫视频 | 日本在线免费观看视频 | xxx性视频| 露脸啪啪清纯大学生美女 | 性色av一区二区 | 男女做事网站 | 欧美a一级片 | 国产激情网站 | 欧美午夜不卡 | 色乱码一区二区三区在线男奴 | 中文字幕网站 | 在线日韩中文字幕 | 精品福利在线 | 成人午夜精品视频 | 九九综合视频 | 色哟哟入口国产精品 | 成人免费播放视频 | 亚洲精品白浆高清久久久久久 | 视频一区欧美 | 欧美在线播放视频 | 欧美激情免费在线观看 | 一区二区三区视频免费 | 国产成人短视频在线观看 | 亚洲插 | 黄色三级网站在线观看 | 清清草免费视频 | 2022国产精品 | 五月婷婷狠狠 | 色网视频 | 日韩欧美福利视频 | 久久久国 | 九色视频国产 | av2014天堂网 | 成年人一级黄色片 | 欧美猛男gaygay | 成人黄色在线观看视频 | 天躁夜夜躁狼狠躁 | 91成人品| 久久91 | 懂色av一区二区三区蜜臀 | 日韩精品成人在线 | 久久国语精品 | 梦梦电影免费高清在线观看 | 性色av免费观看 | 亚洲av激情无码专区在线播放 | 国产成人在线视频观看 | 日本精品一区二区三区四区的功能 | av男人天堂av | 午夜av网址 | 亚洲天堂aaa | 国产又粗又长又黄 | 亚洲精品中文字幕在线 | 毛片毛片毛片毛片毛片毛片毛片毛片 | 无码人妻精品一区二区蜜桃色欲 | 国产成人精品一区二三区 | 无码国产精品高潮久久99 | 99精品黄色| 一区二区视频网站 | 国产伊人网 | 亚洲欧美日韩国产成人精品影院 | 韩国一区二区三区在线观看 | 91福利社在线观看 | 在线波多野结衣 | 成人免费不卡视频 | 中文字幕欧美专区 | 香蕉视频在线网站 | 国产成人无码a区在线观看视频 | 色噜噜狠狠成人中文 | 久久久久久久久久99精品 | 久久综合久久综合久久 | 很黄的性视频 | 国产a自拍 | 久久久久久99精品 | 五月婷婷丁香久久 | 91麻豆精品91久久久久同性 | 国产精品传媒一区二区 |