mat五一怎么搞活动活动怎么完成

如何将unsigned char*图像数据封装成opencv mat reshape中Mat类型 - 51无线网
如何将unsigned char*图像数据封装成opencv mat reshape中Mat类型
OpenCV矩阵Mat的运算——在DIP作业(图像增强)中出现问题解决_Linux编程_Linux公社-Linux系统门户网站
你好,游客
OpenCV矩阵Mat的运算——在DIP作业(图像增强)中出现问题解决
来源:Linux社区&
作者:congleetea
本次作业是要求不用OpenCV中的库函数,选择两张不好的图片对其进行图像增强。我选了一张过白的image,想通过指数变换的方法对其进行图像增强。作为初级学习OpenCV 运用者,由于OpenCV没怎么编过程序,所以一开始就遇到了很多问题。
--------------------------------------分割线 --------------------------------------
编辑推荐:
Linux下安装OpenCV2.4.1所需包
Ubuntu 12.04 安装 OpenCV2.4.2
下OpenCV无法读取视频文件
Ubuntu 12.04下安装OpenCV 2.4.5总结
Ubuntu 10.04中安装OpenCv2.1九步曲
基于QT和OpenCV的人脸识别系统
--------------------------------------分割线 --------------------------------------
1 Mat 的数据类型导致运算的错误
下面是主程序:
#include &iostream&#include &highgui.h&#include &cv.h&#include &math.h&#define POWER_a&3.0& & //幂指数变换的指数大小void PowerTransfor(Mat image);& & & & & & & & & //利用指数变换对过白图片的处理函数int main (){&const char *image_name1=&E:\\Program\\DIP\\HW_1_enhance\\guobai.jpg&;&M& & & & & //save the image that was processed&img = imread(image_name1,CV_LOAD_IMAGE_GRAYSCALE);& & &//只读取灰度分量&cout&&&the size of img is &&&img.rows&&&X&&&img.cols&&&&
&&&&channels is &&&img.channels()&&& //检验是1通道的&cvNamedWindow(&ORIGINAL PICTURE&,CV_WINDOW_AUTOSIZE);&imshow(&ORIGINAL PICTURE&,img);&PowerTransfor(img);&return 0;}
下面就是指数变换函数:
/*************对过白的图片进行处理*******************/void PowerTransfor(Mat image){&Mat newImage(image.size(),CV_64FC1);&double pixMax = 0.0;&double pixMin = 255.0;&for (int i = 0; i & image. i++)&{ & for (int j = 0; j & image. j++)& {& &newImage.at&double&(i,j) = pow(image.at&uchar&(i,j),POWER_a);& &if (newImage.at&double&(i,j) &= pixMax)& &{& & pixMax = newImage.at&double&(i,j);
& &}& &if (newImage.at&double&(i,j) &= pixMin)& &{& & pixMin = newImage.at&double&(i,j);& &}
& }&}&for (int i = 0; i & image. i++)&{& for (int j = 0; j & image. j++)& {& &image.at&uchar&(i,j) = (uchar)(newImage.at&double&(i,j)/(pixMax - pixMin)*255);& //将处理后的值归化到(0~255)中.& }
&}&cvNamedWindow(&PowerTransfor PICTURE&,CV_WINDOW_AUTOSIZE);&imshow(&PowerTransfor PICTURE&,image);&cvWaitKey(0);}
1.1 通过imread读取图像得到的矩阵img,这个矩阵的元素是uchar类型(0:255)的。所以有必要对各种类型的字节数有个了解。
1.2 需要一个保存处理后的像素的矩阵,这个矩阵需要和img的size一致,同时,数据类型又要大于uchar的类型,我们可以用float或者double类型。
定义这个同型矩阵的方法:
Mat newImage(image.size(),CV_32FC1);
Mat newImage(image.rows,image.cols,CV_32FC1);//也可以
错误的方法;
Mat newImage(image.size,CV_32FC1);//size需要括号。
Mat newImage=img.clone(); //得到的是和img同类型的,元素也是相同的,所以不行。
Mat newImage(image.size(),double);//切记,类型是opencv规定的类型,不是C++中的类型double之类的。
本文永久更新链接地址:
相关资讯 & & &
& (08月04日)
& (04/22/:37)
& (06月21日)
& (01/19/:59)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款OpenCV参考手册之Mat类详解1_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
117页免费10页免费1104页免费1页1下载券16页免费 17页免费65页1下载券46页1下载券3页免费5页免费
喜欢此文档的还喜欢3页免费17页1下载券36页1下载券117页免费17页免费
OpenCV参考手册之Mat类详解1|O​p​e​n​C​V​参​考​手​册​之​M​a​t​类​详​解
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢下次自动登录
现在的位置:
& 综合 & 正文
OpenCV中的Mat, cvMat, IplImage
OpenCV中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage。
一、Mat类型:矩阵类型,Matrix。
在openCV中,Mat是一个多维的密集数据数组。可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。
Mat有3个重要的方法:
1、Mat mat = imread(const String* filename);
2、imshow(const string frameName, InputArray mat);
3、imwrite (const string& filename, InputArray img);
Mat类型较CvMat与IplImage类型来说,有更强的矩阵运算能力,支持常见的矩阵运算。在计算密集型的应用当中,将CvMat与IplImage类型转化为Mat类型将大大减少计算时间花费。
关于Mat的数学方面的函数略过。
二、CvMat类型与IplImage类型:“图像”类型
在openCV中,Mat类型与CvMat和IplImage类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和IplImage类型更侧重于“图像”,openCV对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。
我们知道openCV是完全用C实现的,但是,IplImage类型与CvMat类型的关系就像是java(C++?)中的继承关系。实际上,CvMat之上还有一个更抽象的基类----CvArr,这在中会常见。
关于CvMat:
其定义如下:
&span style=&font-size:&&typedef struct CvMat
/* for internal use only */
#ifdef __cplusplus
CvM&/span&
在openCV中,没有向量(vector)的数据结构。任何时候,但我们要表示向量时,用矩阵数据表示即可。但是,CvMat类型与我们在线性代数课程上学的向量概念相比,更抽象,比如CvMat的元素数据类型并不仅限于基础数据类型,比如,下面创建一个二维数据矩阵:
CvMat* cvCreatMat(int rows ,int cols , int type);
这里的type可以是任意的预定义数据类型,比如RGB或者别的多通道数据。这样我们便可以在一个CvMat矩阵上表示丰富多彩的图像了。
关于IplImage:
在类型关系上,我们可以说IplImage类型继承自CvMat类型,当然还包括其他的变量将之解析成图像数据。
其定义如下:
&span style=&font-size:&&typedef struct _IplImage
/* sizeof(IplImage) */
/* version (=0)*/
/* Most of OpenCV functions support 1,2,3 or 4 channels */
/* Ignored by OpenCV */
/* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.
char colorModel[4];
/* Ignored by OpenCV */
char channelSeq[4];
/* ditto */
/* 0 - interleaved color channels, 1 - separate color channels.
cvCreateImage can only create interleaved images */
/* 0 - top-left origin,
1 - bottom-left origin (Windows bitmaps style).
/* Alignment of image rows (4 or 8).
OpenCV ignores it and uses widthStep instead.
/* Image width in pixels.
/* Image height in pixels.
struct _IplROI *
/* Image ROI. If NULL, the whole image is selected. */
struct _IplImage *maskROI;
/* Must be NULL. */
struct _IplTileInfo *tileI
/* Image data size in bytes
(==image-&height*image-&widthStep
in case of interleaved data)*/
char *imageD
/* Pointer to aligned image data.
/* Size of aligned image row in bytes.
BorderMode[4];
/* Ignored by OpenCV.
BorderConst[4];
char *imageDataO
/* Pointer to very origin of image data
(not necessarily aligned) -
needed for correct deallocation */
IplI&/span&
我们可以看到,IplImage类型较之CvMat多了很多参数,比如depth和nChannels。在普通的矩阵类型当中,通常深度和通道数被同时表示,如用32位表示RGB+Alpha.但是,在图像处理中,我们往往将深度与通道数分开处理,这样做是OpenCV对图像表示的一种优化方案。
IplImage 的对图像的另一种优化是变量origin----原点。在计算机视觉处理上,一个重要的不便是对原点的定义不清楚,图像来源,编码格式,甚至操作系统都会对原地的选取产生影响。为了弥补这一点,openCV允许用户定义自己的原点设置。取值0表示原点位于图片左上角,1表示左下角。
dataOrder参数定义数据的格式。有IPL_DATA_ORDER_PIXEL和IPL_DATA_ORDER_PLANE两种取值,前者便是对于像素,不同的通道的数据交叉排列,后者表示所有通道按顺序平行排列。
IplImage类型的所有额外变量都是对“图像”的表示与计算能力的优化。
转自:http://-qq-/blog/1409639
&&&&推荐文章:
【上篇】【下篇】下次自动登录
现在的位置:
& 综合 & 正文
Opencv中Mat数据访问方式效率对比分析
OPENCV库是一个应用非常广泛的计算机视觉与机器学习库,而对矩阵的访问也是最常见.的操作。尽管OPENCV已经升级了N多次,最新版本是2.4.6,但对数据的访问一直还是延续OPENCV1.X中讲解的效率最高的访问方式,也即指针方式。今天偶来兴致,想测测自己频繁使用访问数组方式的各种效率,结果令人惊讶(本测试是在OPENCV2.4.6库下进行的)。
首先准备下面三段(函数代码很简单,就是逐个访问矩阵中的元素):
1)根据矩阵的连续性进行访问(一直以为是效率最高的方式)
void computeWithContinious( Mat& _src, Mat& _dst, float scale)
_dst = cv::Scalar::all(0);
Size size = _src.size();
int chns = _src.channels();
if( _src.isContinuous() && _dst.isContinuous() )
size.width *= size.
size.height = 1;
for( i = 0; i & size. i++ )
unsigned char* src = (const unsigned char*)(_src.data + _src.step*i);
unsigned char* dst = ( unsigned char*)(_dst.data + _dst.step*i);
for( j =0; j & size. j++ )
if ( chns ==1)
dst[j] = src[j];
dst[j*chns] = ( unsigned char)(src[j*chns]*scale);
dst[j*chns+1] = ( unsigned char)(src[j*chns+1]*scale);
dst[j*chns+2] = ( unsigned char)(src[j*chns+2]*scale);
2)传统指针的方式(OPENCV 1.X中最优效率的方式)
void computeWithPointer( Mat& _src, Mat& _dst, float scale)
_dst = cv::Scalar::all(0);
int height = _src.
int width = _src.
Size size = _src.size();
int chns = _src.channels();
for( i = 0; i & i++ )
unsigned char* src = (const unsigned char*)(_src.data + _src.step*i);
unsigned char* dst = ( unsigned char*)(_dst.data + _dst.step*i);
for( j =0; j & j++ )
if ( chns ==1)
dst[j] = src[j];
dst[j*chns] = ( unsigned char)(src[j*chns]*scale);
dst[j*chns+1] = ( unsigned char)(src[j*chns+1]*scale);
dst[j*chns+2] = ( unsigned char)(src[j*chns+2]*scale);
3)Mat的at函数访问(一直以为是效率最低的方式)
void computeWithAt( Mat& _src, Mat& _dst, float scale)
_dst = cv::Scalar::all(0);
int height = _src.
int width = _src.
Size size = _src.size();
int chns = _src.channels();
for( i = 0; i & i++ )
for( j =0; j & j++ )
if ( chns ==1)
_dst.at&uchar&(i,j) = _src.at&uchar&(i,j);
_dst.at&Vec3b&(i,j) = _src.at&Vec3b&(i,j)*
4)Main函数测试部分
int main( int argc, char* argv[])
const char* file_path = &E:\\Video\\lena.jpg&;
double frequency = getTickFrequency()/1000;
Mat src = imread(file_path);
Mat dst(src.rows, src.cols, src.type());
double t0 = getTickCount();
computeWithAt(src, dst,0.8f);
double t1 = getTickCount();
computeWithPointer(src, dst,0.8f);
double t2 = getTickCount();
computeWithContinious(src, dst,0.8f);
double t3 = getTickCount();
double dt1 = (t1-t0)/
double dt2 = (t2-t1)/
double dt3 = (t3-t2)/
cout&&&computeWithAt time:&&&dt1&&&ms&&&
cout&&&computeWithPointer time:&&&dt2&&&ms&&&
cout&&&computeWithContinious time:&&&dt3&&&ms&&&
system(&pause&);
到这里,准备工作已经完成,大家可以猜猜哪种方式效率最高(思考30秒)??思考完了,再来看看下面的测试图:
(奇怪了??结果与公司里的电脑测试的结果不同,公司电脑测试的结果是computeWithAt最快,computeWithContinious最慢,可能公司电脑比较老,对TBB和SSE指令支持不太好,有兴趣的读者可以自己测试下)。但这次测试结果与预期的相同,先前个人分析了先这三种矩阵的访问方式,其实at方式的访问在底层采用的也是指针,但是在对矩阵进行逐一访问,每次都要对地址重新计算和定位,因此相对于指针访问方式来说(指针访问方式是通过移动指针来定位下一个元素的位置),效率就有慢;而对于本次测试中效率最高的Continious方式来说,因为这种访问方式由于矩阵数据的存放是连续的(这里又有疑问呢?怎么样的才是连续呢?
连续就是指矩阵中行与行之间是对齐的,即行的末尾没有gap(因为内存中的数据存储时为了提高效率,一般都是安字节对齐的)),将两层循环编程一层循环(rows =1),减少了循环时间,而且通过指针移动来逐一对数据进行访问,自然速度会比指针的方式快。
综上所述,在对矩阵进行访问时,computerWithContinious是最快的,其次是computeWithPointer,最后是computeWithAt。但这也因机器而有些差别。在公司的奔腾系列电脑上的测试结果与上面是相反的(at最快,指针次之,最后是continious),但在我四核的本本上的测试结果与预期是一致的。
最后,读者有兴趣可以去看看底层的关于这几种访问方式的实现,通过对的分析也可以为今后写出高效率的代码提供一些技巧和窍门。
&&&&推荐文章:
【上篇】【下篇】
说的太好了,我顶!
Copyright & 2015
Corporation, All Rights Reserved后使用快捷导航没有帐号?
查看: 158|回复: 17
五一 活动不错
帖子威望金豆
妹纸何在 我要妹纸
偶是水 愛三宮 妳懂得
LV.12, 积分 25230, 距离下一级还需 4771 积分
发表于 前天&16:32
谁建议的送宠物& &还是天才狗& &来温州& &我请你吃麻辣烫& && && && & 建议大家买个宠物改名卡& & 改啥&&自己想& && && && &
一花一世界,一草一天堂,一叶一追寻,一木一浮生,一树一菩提,一生为一人...
帖子威望金豆
MAT运营负责人
发表于 前天&16:43
帖子威望金豆
发表于 前天&16:52
帖子威望金豆
发表于 前天&16:54
。。。眼镜狗,真的好吗?
专修美国航母,核潜艇补漏,核弹头翻新,改装,抛光,喷漆.回收二手航母,维修核反应堆,清洗航母油槽、航天飞机保养换三滤.拆洗导弹发动机,坦克免费改装升级发动机.阿帕奇直升机扩展货仓,二手坦克换链上油,专业批发各类轰炸机、无人机、单兵作战武器等。量大从优!
帖子威望金豆
妹纸何在 我要妹纸
偶是水 愛三宮 妳懂得
发表于 前天&16:56
。。。眼镜狗,真的好吗?
一花一世界,一草一天堂,一叶一追寻,一木一浮生,一树一菩提,一生为一人...
帖子威望金豆
妹纸何在 我要妹纸
偶是水 愛三宮 妳懂得
发表于 前天&16:56
一花一世界,一草一天堂,一叶一追寻,一木一浮生,一树一菩提,一生为一人...
帖子威望金豆
发表于 前天&16:57
。。。。有什么特殊属性?
专修美国航母,核潜艇补漏,核弹头翻新,改装,抛光,喷漆.回收二手航母,维修核反应堆,清洗航母油槽、航天飞机保养换三滤.拆洗导弹发动机,坦克免费改装升级发动机.阿帕奇直升机扩展货仓,二手坦克换链上油,专业批发各类轰炸机、无人机、单兵作战武器等。量大从优!
帖子威望金豆
妹纸何在 我要妹纸
偶是水 愛三宮 妳懂得
发表于 前天&16:58
。。。。有什么特殊属性?
全房爆笑& &&&吸引妹纸几率上升& &
一花一世界,一草一天堂,一叶一追寻,一木一浮生,一树一菩提,一生为一人...
帖子威望金豆
发表于 前天&16:59
全房爆笑& &&&吸引妹纸几率上升
。。。。卧槽,这属性好强大!
专修美国航母,核潜艇补漏,核弹头翻新,改装,抛光,喷漆.回收二手航母,维修核反应堆,清洗航母油槽、航天飞机保养换三滤.拆洗导弹发动机,坦克免费改装升级发动机.阿帕奇直升机扩展货仓,二手坦克换链上油,专业批发各类轰炸机、无人机、单兵作战武器等。量大从优!
帖子威望金豆
妹纸何在 我要妹纸
偶是水 愛三宮 妳懂得
发表于 前天&17:01
。。。。卧槽,这属性好强大!
你值得拥有
一花一世界,一草一天堂,一叶一追寻,一木一浮生,一树一菩提,一生为一人...
钟灵毓秀(活动勋章)
逍遥社区专用
俏皮天使(大话红楼)
西班牙铁杆球迷
逍遥社区专用
葫芦娃之大力士
逍遥社区专用
九天神话专用
麻辣江湖专用
蛋蛋的忧桑
逍遥社区到听图说专用
Powered by
Copyright & 2014 .All rights reserved.五一活动!!!!!!!!_mat吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:2,313贴子:
五一活动!!!!!!!!收藏
眼镜什么意思,五一不送M点了???
1楼 21:19&|
相关的贴子1107048355相关的图贴
登录百度帐号
内&&容:使用签名档&&
为兴趣而生,贴吧更懂你。&或您所在的位置: &
1.4.1 NumPy、SciPy和Matplotlib简介
1.4.1 NumPy、SciPy和Matplotlib简介
人民邮电出版社
《机器学习系统设计》本书是实用的Python 机器学习教程,结合大量案例,介绍了机器学习的各方面知识。本书不仅告诉你“怎么做”,还会分析“为什么”,力求帮助读者掌握多种多样的机器学习Python 库,学习构建基于Python的机器学习系统,并亲身实践和体验机器学习系统的功能。本节为NumPy、SciPy和Matplotlib简介。
如果你已经安装了Python(2.7或更高版本),那么还需要安装NumPy和SciPy来处理数据,并需要安装Matplotlib对数据进行可视化。
1.4.1 NumPy、SciPy和Matplotlib简介
在讨论具体的机器学习算法之前,必须说一下如何最好地存储需要处理的数据。这很重要,因为多数高级学习算法,如果运行永远不会结束,对我们毫无用处。这可能仅仅是因为数据访问太慢了,也可能是因为这些数据的表示方式迫使操作系统一直做数据交换。再加上Python是一种解释性语言(尽管是高度优化过的),和C或者Fortran相比,这类语言对很多重数值算法来说运行缓慢。所以或许应该问一问究竟为什么有这么多科学家和公司,甚至在高度计算密集型领域内豪赌Python。
答案就是,在Python中很容易把数值计算任务交给下层的C或Fortran扩展包。这也正是NumPy和SciPy要做的事情()。在NumPy和SciPy这个组合中,NumPy提供了对高度优化的多维数组的支持,而这正是大多数新式算法的基本数据结构。SciPy则通过这些数组提供了一套快速的数值分析方法库。最后,用Python来绘制高品质图形,Matplotlib()也许是使用最方便、功能最丰富的程序库了。
&【责任编辑: TEL:(010)】&&&&&&
关于&&的更多文章
本书是实用的Python 机器学习教程,结合大量案例,介绍了机器学
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
讲师: 0人学习过讲师: 0人学习过讲师: 738人学习过
《股市通鉴――5年赢利5000倍揭秘》深入研究了国内顶
《Netty权威指南》是异步非阻塞通信领域的经典之作,
《C++ 程序设计经典300例》针对C++语言的各个应用方向
本书是目前中文版本第一个真正介绍PHP 5及MySQL 5新增语法与功能的权威宝典!
本书本着精、全、要三宗旨,从理论中延伸,从实践
51CTO旗下网站

我要回帖

更多关于 净水机五一怎么做活动 的文章

 

随机推荐