先看一个简单的样例

代码:

// ConsoleApplication3_6_23.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace std;
using namespace cv; int _tmain(int argc, _TCHAR* argv[])
{
Mat src,dst,dst1,dst2;
src = imread("test.png");
if(!src.data)
return -1;
namedWindow("原图",CV_WINDOW_AUTOSIZE);
namedWindow("x--",CV_WINDOW_AUTOSIZE);
namedWindow("y--",CV_WINDOW_AUTOSIZE);
imshow("原图",src);
int nr = src.rows;
int nc = src.cols;
/************************************************************************/
/* x方向 */
/************************************************************************/
dst = src.clone();
for (int i = 0;i < nr;++i)
{
for (int j = 0;j < nc;++j)
{
dst.at<Vec3b>(i,j) = src.at<Vec3b>(i,nc-j-1);
}
}
imshow("x--",dst);
/************************************************************************/
/* y方向 */
/************************************************************************/
src.copyTo(dst1);
for (int i = 0;i < nr;++i)
{
for (int j = 0;j < nc;++j)
{
dst1.at<Vec3b>(i,j) = src.at<Vec3b>(nr-i-1,j);
}
}
imshow("y--",dst1);
waitKey(0);
return 0;
}

1、Mat的ptr和[]

void image_rever(Mat& src,Mat& dst)
{
int nr = src.rows;
int nc = src.cols;
int ch = src.channels();
for (int i = 0;i < nr;++i)
{
uchar* srcr = src.ptr<uchar>(i);
uchar* dstr = dst.ptr<uchar>(i);
for (int j = 0;j < nc;++j)
{
dstr[ch * j + 0] = srcr[ch * (nc - j - 1) + 0];
dstr[ch * j + 1] = srcr[ch * (nc - j - 1) + 1];
dstr[ch * j + 2] = srcr[ch * (nc - j - 1) + 2];
}
}
}

2、Mat的ptr和指针

void image_rever(Mat& src,Mat& dst)
{
int nr = src.rows;
int nc = src.cols;
int ch = src.channels();
for (int i = 0;i < nr;++i)
{
uchar* srcr = src.ptr<uchar>(i);
uchar* dstr = dst.ptr<uchar>(i);
for (int j = 0;j < nc;++j)
{ *(dstr + ch * j + 0) = *(srcr + (ch * (nc - j - 1) + 0));
*(dstr + ch * j + 1) = *(srcr + (ch * (nc - j - 1) + 1));
*(dstr + ch * j + 2) = *(srcr + (ch * (nc - j - 1) + 2));
}
}
}

3、Mat的迭代器iterator

void image_rever(Mat& src,Mat& dst)
{
typedef cv::Mat_<cv::Vec3b>::iterator matIterator;
matIterator db = dst.begin<cv::Vec3b>();
matIterator de = dst.end<cv::Vec3b>(); matIterator se = src.end<cv::Vec3b>() - 1;
for (; db != de; ++db,--se)
{
*db = *se;
}
}

void image_rever(Mat& src,Mat& dst)
{
typedef cv::Mat_<cv::Vec3b>::iterator matIterator;
matIterator db = dst.begin<cv::Vec3b>();
matIterator de = dst.end<cv::Vec3b>(); matIterator se = src.end<cv::Vec3b>() - 1;
for (; db != de; ++db,--se)
{
(*db)[0] = 255 - (*se)[0];
(*db)[1] = 255 - (*se)[1];
(*db)[2] = 255 - (*se)[2];
}
}

opencv-从图像旋转学习Mat数据訪问的更多相关文章

  1. OpenCV中图像的格式Mat 图像深度

    opencv中图像的格式Mat 有图像的定义,图像深度.类型格式等,其中Mat的参数depth为深度,深度反应出图像颜色像素值: 关于数据的储存:(转) Mat_<uchar>对应的是CV ...

  2. Spring ORM数据訪问——Hibernate

    Hibernate 我们将首先介绍Spring环境中的Hibernate 5.然后介绍使用Hibernate 5来演示Spring集成O-R映射器的方法. 本节将具体介绍很多问题,并显示DAO实现和事 ...

  3. SmaterWeatherApi---签名加密和数据訪问--简单粗暴一步搞定

    -----------------------------------------------------更新-2014-07-09---------------------------------- ...

  4. OpenCV几种访问cv::Mat数据的方法

    一般来说,如果是遍历数据的话用指针ptr比用at要快.特别是在debug版本下.因为debug中,OpenCV会对at中的坐标检查是否有溢出,这是非常耗时的. 代码如下 #include <op ...

  5. 吐嘈OpenCV的图像旋转功能 >_<7

    實在出乎我的意料!OpenCV竟然連這么簡單的功能都沒有封裝!還要讓本大爺自己動手寫!強烈要求OpenCV下一個版本添加本功能! 函數功能和這個網頁一樣,只不過這個作者寫的太糟了,我把它變得簡潔了一點 ...

  6. Java并发学习之十五——使用读写锁同步数据訪问

    本文是学习网络上的文章时的总结.感谢大家无私的分享. 读写锁重要的是写锁的使用,仅仅用一个入口. 以下是读写锁使用的样例 package chapter2; import java.util.conc ...

  7. OpenCV计算机视觉学习(11)——图像空间几何变换(图像缩放,图像旋转,图像翻转,图像平移,仿射变换,镜像变换)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 图像 ...

  8. OpenCV:OpenCV图像旋转的代码

    OpenCV图像旋转的代码 cv::transpose( bfM, bfM ) 前提:使用两个矩阵Mat型进行下标操作是不行的,耗费的时间太长了.直接使用两个指针对拷贝才是王道.不知道和OpenCV比 ...

  9. opencv 图像旋转

    理论 http://www.cnblogs.com/wangguchangqing/p/4045150.html 翻开任意一本图像处理的书,都会讲到图像的几何变换,这里面包括:仿射变换(affine ...

随机推荐

  1. SDL2中文教程

    SDL2.0 Tutorial Index 原文地址:SDL 2.0 Tutorial Index Welcome! 下面的教程旨在为你提供一个SDL2.0以及c++中游戏设计和相关概念的介绍.在本教 ...

  2. 简单的图形学(三)——光源

    参考自:用JavaScript玩转计算机图形学(二)基本光源 - Milo Yip - 博客园,主要讲述三种最基本的光源--平行光.点光源.聚光灯,其实就是三种数学模型. 代码的调整 先前的代码中,颜 ...

  3. BNUOJ-1065或运算的简单解法

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=1065 下面有一个程序:--------------------------------------- ...

  4. pdo_mysql安装

    如果编译时没有编译pdo模块,可以cd 到php编译时的目录,重新编译 1.切换到pdo_mysql目录,如php-5.5.10/ext/pdo_mysql/ 2.生成configure文件,在pdo ...

  5. 【Unity笔记】将角色的碰撞体朝向鼠标点击方向——角色朝向鼠标

    int floorMask; // 自动寻路层 void Awake() { floorMask = LayerMask.NameToLayer("Floor"); } void ...

  6. C语言 · 学生信息(P1102)

    算法训练 P1102   时间限制:1.0s   内存限制:256.0MB      定义一个学生结构体类型student,包括4个字段,姓名.性别.年龄和成绩.然后在主函数中定义一个结构体数组(长度 ...

  7. kernel 3.2.0 上加入自己的板级文件

    第一步.复制自己的参考的板级文件 cp arch/arm/mach-omap2/board-am335xevm.c arch/arm/mach-omap2/board-aplex_ECM_5412.c ...

  8. java方法——重载2

    什么是Java方法重载 方法重载的定义 1 对于同一个类,如果这个类里面有两个或者多个重名的方法,但是方法的参数个数.类型.顺序至少有一个不一样,这时候局构成方法重载. END 方法重载示例 1 pu ...

  9. SQL SERVER 2005快捷键

    一.SQL SERVER 2005快捷键 快捷键 功能 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O打开项目 ...

  10. R语言--saprkR基本使用

    1.在sparkR的shell中交互式使用 sparkR --masterspark://10.130.2.20:7077 sparkR --masterlocal[6] #sparkR --mast ...