Opencv图像与矩阵的操作
#include "stdafx.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h> //程序所需的头文件 //两个自定义的函数,用于实现图像的条件复制,效果见如下附图。
IplImage *myCopyImage(IplImage* img, int Row, int Col, int Width, int Height);
CvMat *myCopyMat(IplImage* img, int Row, int Col, int Width, int Height); /*主函数,它会调用本例程中的两个函数进行图像的剪切操作*/
int _tmain(int argc, _TCHAR* argv[])
{
//Step1:打开并显示原始图像,效果见图2啦~~
IplImage *img = cvLoadImage("Koala.jpg", -1); //读取图像Koala.jpg
cvNamedWindow("Image:",1); //创建一个图像窗口
cvShowImage("Image:",img); //显示读取的图像 //Step2:运用内部函数复制并显示复制后的图像,效果和图2一样,就是多了个窗口显示这幅图像,为了对比一下而已,所以就不费篇幅啦~~
IplImage *copy = cvCloneImage(img); //调用内部函数复制图像
cvNamedWindow("Copy",1); //创建一个图像窗口
cvShowImage("Copy",copy); //显示复制的图像 //Step3:自己编写复制图像块函数,并显示复制的图像块(图像方式),剪切了起始位置(200,200),宽高(300,300)的图像,函数定义看最上面,实现看后面,效果见图3
IplImage *Block = myCopyImage(img,200,200,300,300);//自定义条件复制函数复制图像
if(Block) //判断是否成功复制
{
cvNamedWindow("SubImage",1); //创建一个图像窗口
cvShowImage("SubImage",Block); //显示复制的图像块
cvWaitKey(); //等待键盘事件
cvDestroyWindow("SubImage"); //关闭图像窗口
cvReleaseImage(&Block); //清除图像块
} //Step4:自己编写复制图像块函数,并显示复制的图像块(矩阵方式),和前面的效果是一样的,但是是对矩阵进行操作,显示的也是矩阵,效果还是图3的样子~~
CvMat *a = myCopyMat(img,200,200,300,300); //自定义条件复制函数复制图像
if(a) //判断是否成功复制
{
cvNamedWindow("Matrix",1); //创建一个图像窗口
cvShowImage("Matrix",a); //显示复制的图像块
cvWaitKey(); //等待键盘事件
cvDestroyWindow("Matrix"); //关闭图像窗口
cvReleaseMat(&a); //清除图像块
}
cvDestroyWindow("Image:"); //关闭原图像窗口
cvReleaseImage(&img); //清除原图像
cvReleaseImage(©); //清除内部函数复制的图像
return 0;
} /* 上面就是调用这个函数进行剪切的,通过输入起始位置和图像的宽高就可以剪切你想要的部分,多通道单通道都适用哦~~*/
IplImage *myCopyImage(IplImage* img, int Row, int Col, int Width, int Height)
{
int img_Width = img->width;
int img_Height = img->height;
int img_Channel = img->nChannels;
printf("源图像参数:\n\t宽:%d\n\t高:%d\n\t通道数:%d\n", img_Width, img_Height, img_Channel); //获取原图像的基本参数 if((Row<0) | (Col<0) | ((Row+Height)>img_Width) | ((Col+Width)>img_Height))
{
printf("\nError:\n\t请输入正确的起始位置和复制宽高!\n\t返回为空");
return NULL;
} //对条件进行判断,防止错误复制 IplImage* Block = cvCreateImage(cvSize(Width,Height),IPL_DEPTH_8U,img_Channel);
//创建一幅空图像
int b_step = Block->widthStep; for (int i=0;i<Height;i++)
for(int j=0;j<Width;j++)
for(int k=0;k<img_Channel;k++)
{
Block->imageData[i*b_step+j*img_Channel+k] =
img->imageData[(i+Row)*
(img->widthStep)+(j+Col)*img_Channel+k];
} //三次循环,将原图中所需复制的每一个像素点填充到新的图像中去
return Block;
} /* 用矩阵的方式复制图像的部分或者全部,效果和上面一样,过程起始页差不多,只是里面的操作对象就是矩阵。PS:当然图像也是矩阵,要是这么看的话就无差别了~~*/
CvMat *myCopyMat(IplImage* img, int Row, int Col, int Width, int Height)
{
int img_Width = img->width;
int img_Height = img->height;
int img_Channel = img->nChannels;
printf("源图像参数:\n\t宽:%d\n\t高:%d\n\t通道数:%d\n", img_Width, img_Height, img_Channel); //获取原图像的基本参数 if((Row<0) | (Col<0) | ((Row+Height)>img_Width) | ((Col+Width)>img_Height))
{
printf("\nError:\n\t请输入正确的起始位置和复制宽高!\n\t返回为空");
return NULL;
} //对条件进行判断,防止错误复制 CvMat *a = cvCreateMat(Height, Width, CV_MAKETYPE(CV_8U,img_Channel));
//创建一幅空矩阵
int b_step = a->step;
for (int i=0;i<Height;i++)
for(int j=0;j<Width;j++)
for(int k=0;k<img_Channel;k++)
{
a->data.ptr[i*b_step+j*img_Channel+k] = img->imageData[(i+Row)*
(img->widthStep)+(j+Col)*img_Channel+k];
}
return a;
}
附图

图1源图像(Koala.jpg)的简单参数

图2.源图像

图3.操作后的图像
Opencv图像与矩阵的操作的更多相关文章
- opencv——图像遍历以及像素操作
摘要 我们在图像处理时经常会用到遍历图像像素点的方式,在OpenCV中一般有四种图像遍历的方式,在这里我们通过像素变换的点操作来实现对图像亮度和对比度的调整. 补充: 图像变换可以看成 像素变换--点 ...
- 关于OpenCV图像操作的默认参数问题
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51559490 在使用OpenCV以及其 ...
- opencv图像阈值操作
使用threshold方法和adaptivethreshold方法对图像进行阈值分割操作. 1.使用threshold方法,设置一个阈值,将大于阈值的值变换为最大值,小于阈值的值变换为0. #-*- ...
- opencv中Mat类型数据操作与遍历
Mat作为opencv中一种数据类型常常用来存储图像,相对与以前的IplImgae类型来说,Mat类型省去了人工的对内存的分配与释放,转而自动分配释放.Mat Class主要包括两部个数据部分:一个是 ...
- OpenCV:OpenCV图像旋转的代码
OpenCV图像旋转的代码 cv::transpose( bfM, bfM ) 前提:使用两个矩阵Mat型进行下标操作是不行的,耗费的时间太长了.直接使用两个指针对拷贝才是王道.不知道和OpenCV比 ...
- <学习opencv>图像和大型阵列类型
OPenCV /*=========================================================================*/ // 图像和大型阵列类型 /* ...
- OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...
- OpenCV快速遍历矩阵元素方法
OpenCV中Mat矩阵data数据的存储方式和二维数组不一致,二维数组按照行优先的顺序依次存储,而Mat中还有一个标示行步进的变量Step.使用Mat.ptr<DataTyte>(row ...
- 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...
随机推荐
- javascript函数的声明和调用
× 目录 [1]函数的声明方式 [2]函数的调用方式 [3]两种声明方式的区别 函数:将完成某一特定功能的代码集合起来,可以重复使用的代码块. ---------------------------- ...
- 23----2013.07.01---Div和Span区别,Css常用属性,选择器,使用css的方式,脱离文档流,div+css布局,盒子模型,框架,js基本介绍
01 复习内容 复习之前的知识点 02演示VS创建元素 03div和span区别 通过display属性进行DIV与Span之间的转换.div->span 设置display:inline ...
- 怎么解决tomcat占用8080端口问题图文教程(转)
亲测有效. 原因:可能是开了多个tomcat 原文网址:http://jingyan.baidu.com/article/1612d5006c3cdae20e1eee04.html 怎么解决tomc ...
- c#高级编程第七版 学习笔记 第一章 .NET体系结构
第一章 .NET体系结构 本章内容: 编译和运行面向.NET的代码 Microsoft中间语言(Microsoft Intermediate Language,MSIL或简称IL)的优点 值 ...
- php面向对象的特性:OOP的封装
字段的作用域: 1.public 公共的(类外可以访问) 2.private 私有的(只能类内访问) 3.protected 受保护的(类内和子类可以访问,类外无法访问) /*通过公共的方法来访问私有 ...
- (转)Yale CAS + .net Client 实现 SSO(2)
第一部分:安装配置 Tomcat 第二部分:安装配置 CAS 1. 下载 CAS 及.NET CAS client. CAS下载地址:http://www.jasig.org/cas/download ...
- spring事务配置的坑
基于 <tx> 命名空间的声明式事务管理 前面两种声明式事务配置方式奠定了 Spring 声明式事务管理的基石.在此基础上,Spring 2.x 引入了 <tx> 命名空间,结 ...
- sicily 1022. Train Problem
本题主要是出栈入栈顺序的问题 Home Problems My Status Standing <-> 1022. Train Problem Total: 2 ...
- ZigBee HA示例程序分析
ZigBee协议栈中自带的HomeAutomation例程,虽然也是操作灯泡,但是,是通过ZCL来统一处理的,符合HA profile规范,互连互操作性较好.下面就简要分析以下ZCL的使用. 在任务数 ...
- JAVA设计模式(DESIGN PATTERNS IN JAVA)读书摘要 第1部分接口型模式——第4章 外观(Facade)模式
外观模式就类似于一个工具包,一个类对应一个功能. 外观模式的意图是为子系统提供一个接口,便于它的使用. 书中给出的例子是画一个哑弹的飞行路径, 初始的类的设计是这样的,看下图, ShowFlight类 ...