访问Mat图像中每个像素的值

http://blog.csdn.net/xiaowei_cqu/article/details/7771760





 

【OpenCV】访问Mat图像中每个像素的值

分类: 【图像处理】   21945人阅读  评论(26)  收藏  举报

目录(?)[+]

今天百度搜资料还搜到了自己的。。。《访问图像中每个像素的值》,这是之前写的了,用的也是2.0的风格IplImage*格式,不太适用后来Mat的格式,特此重写一篇。

以下例子源自《The OpenCV Tutorials --Release 2.4.2》2.2 How to scan images, lookup tables and time measurement with OpenCV


图像容器Mat

还是先看Mat的存储形式。Mat和Matlab里的数组格式有点像,但一般是二维向量,如果是灰度图,一般存放 <uchar>类型;如果是RGB彩色图,存放 <Vec3b>类型。
单通道灰度图数据存放格式:

多通道的图像中,每列并列存放通道数量的子列,如RGB三通道彩色图:

注意通道的顺序反转了:BGR。通常情况内存足够大的话图像的每一行是连续存放的,也就是在内存上图像的所有数据存放成一行,这中情况在访问时可以提供很大方便。可以用  isContinuous()函数来判断图像数组是否为连续的。

访问图像中的像素


高效的方法:C操作符[ ]

最快的是直接用C风格的内存访问操作符[]来访问:
[cpp]  view plain copy
  1. Mat& ScanImageAndReduceC(Mat& I, const uchar* const table)  
  2. {  
  3.     // accept only char type matrices  
  4.     CV_Assert(I.depth() != sizeof(uchar));  
  5.     int channels = I.channels();  
  6.     int nRows = I.rows ;  
  7.     int nCols = I.cols* channels;  
  8.     if (I.isContinuous())  
  9.     {  
  10.         nCols *= nRows;  
  11.         nRows = 1;  
  12.     }  
  13.     int i,j;  
  14.     uchar* p;  
  15.     for( i = 0; i < nRows; ++i)  
  16.     {  
  17.         p = I.ptr<uchar>(i);  
  18.         for ( j = 0; j < nCols; ++j)  
  19.         {  
  20.             p[j] = table[p[j]];  
  21.         }  
  22.     }  
  23.     return I;  
  24. }  
注意: 书中这段代码是有问题的,前面写成了 
[cpp]  view plain copy
  1. int nRows = I.rows * channels;  
  2. int nCols = I.cols;  
一般情况 isContinous为true,运行不会出错,但你可以注释掉那个if,会有访问越界的问题。
这种访问形式就是在每行定义一个指针,然后在内存上直接连续访问。如果整个数组在内存上都是连续存放的,那么只需要定义一个指针就可以访问所有的数据!如单通道的灰度图访问方式如下:
[cpp]  view plain copy
  1. uchar* p = I.data;  
  2. for( unsigned int i =0; i < ncol*nrows; ++i)  
  3.     *p++ = table[*p];  

安全的方法:迭代器iterator

相比用指针直接访问可能出现越界问题,迭代器绝对是非常安全的方法:
[cpp]  view plain copy
  1. Mat& ScanImageAndReduceIterator(Mat& I, const uchar* const table)  
  2. {  
  3.     // accept only char type matrices  
  4.     CV_Assert(I.depth() != sizeof(uchar));  
  5.     const int channels = I.channels();  
  6.     switch(channels)  
  7.     {  
  8.     case 1:  
  9.         {  
  10.             MatIterator_<uchar> it, end;  
  11.             for( it = I.begin<uchar>(), end = I.end<uchar>(); it != end; ++it)  
  12.                 *it = table[*it];  
  13.             break;  
  14.         }  
  15.     case 3:  
  16.         {  
  17.             MatIterator_<Vec3b> it, end;  
  18.             for( it = I.begin<Vec3b>(), end = I.end<Vec3b>(); it != end; ++it)  
  19.             {  
  20.                 (*it)[0] = table[(*it)[0]];  
  21.                 (*it)[1] = table[(*it)[1]];  
  22.                 (*it)[2] = table[(*it)[2]];  
  23.             }  
  24.         }  
  25.     }  
  26.     return I;  
  27. }  
这里我们只定义了一个迭代器,用了一个for循环,这是因为在OpenCV里迭代器会访问每一列然后自动跳到下一行,不用管在内存上是否isContinous。另外要注意的是在三通道图像中我们定义的是 <Vec3b>格式的迭代器,如果定义成uchar,则只能访问到B即蓝色通道的值。
这种方式虽然安全,但是挺慢的,一会儿就知道了。

更慢的方法:动态地址计算

这种方法在需要连续扫描所有点的应用时并不推荐,因为它更实用与随机访问。这种方法最基本的用途是访问任意的某一行某一列:
[cpp]  view plain copy
  1. Mat& ScanImageAndReduceRandomAccess(Mat& I, const uchar* const table)  
  2. {  
  3.     // accept only char type matrices  
  4.     CV_Assert(I.depth() != sizeof(uchar));  
  5.     const int channels = I.channels();  
  6.     switch(channels)  
  7.     {  
  8.     case 1:  
  9.         {  
  10.             forint i = 0; i < I.rows; ++i)  
  11.                 forint j = 0; j < I.cols; ++j )  
  12.                     I.at<uchar>(i,j) = table[I.at<uchar>(i,j)];  
  13.             break;  
  14.         }  
  15.     case 3:  
  16.         {  
  17.             Mat_<Vec3b> _I = I;  
  18.   
  19.             forint i = 0; i < I.rows; ++i)  
  20.                 forint j = 0; j < I.cols; ++j )  
  21.                 {  
  22.                     _I(i,j)[0] = table[_I(i,j)[0]];  
  23.                     _I(i,j)[1] = table[_I(i,j)[1]];  
  24.                     _I(i,j)[2] = table[_I(i,j)[2]];  
  25.                 }  
  26.                 I = _I;  
  27.                 break;  
  28.         }  
  29.     }  
  30.     return I;  
  31. }  
因为这种方法是为随机访问设计的,所以真的是奇慢无比。。。

减小颜色空间 color space reduction

现在来介绍下上述函数对每个元素的操作,也就是用table更改像素值。这里其实是做了个减小颜色空间的操作,这在一些识别之类的应用中会大大降低运算复杂度。类如uchar类型的三通道图像,每个通道取值可以是0~255,于是就有 256*256个不同的值。我们可以通过定义:
0~9 范围的像素值为 0
10~19 范围的像素值 为 10
20~29 范围的像素值为 20
。。。。。。
着这样的操作将颜色取值降低为 26*26*26 种情况。这个操作可以用一个简单的公式:

来实现,因为C++中int类型除法操作会自动截余。 类如 Iold=14; Inew=(Iold/10)*10=(14/10)*10=1*10=10;
在处理图像像素时,每个像素需要进行一遍上述计算也需要一定的时间花销。但我们注意到其实只有 0~255 种像素,即只有256种情况。进一步可以把256种计算好的结果提前存在表中 table 中,这样每种情况不需计算直接从 table 中取结果即可。
[cpp]  view plain copy
  1. int divideWith=10;   
  2. uchar table[256];  
  3. for (int i = 0; i < 256; ++i)  
  4.     table[i] = divideWith* (i/divideWith);  
于是table[i]存放的是值为i的像素减小颜色空间的结果,这样也就可以理解上述方法中的操作:
[cpp]  view plain copy
  1. p[j] = table[p[j]];  

LUT : Look up table

OpenCV 很聪明的有个 LUT 函数就是针对这种 Look up talbe 的操作:
[cpp]  view plain copy
  1. Mat lookUpTable(1, 256, CV_8U);  
  2. uchar* p = lookUpTable.data;  
  3. forint i = 0; i < 256; ++i)  
  4.     p[i] = table[i];  
  5. for (int i = 0; i < times; ++i)  
  6.     LUT(I, lookUpTable, J);  

算法计时

为了验证几种方法的效率,可以用一个简单的计时和输出:
[cpp]  view plain copy
  1. double t;  
  2. t = (double)getTickCount();  
  3. t = 1000*((double)getTickCount() - t)/getTickFrequency();  
  4. t /= times;  

实验结果


原图:


降低颜色空间结果:


算法时间:


更清楚的时间对比表:


转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/7771760
实验代码下载:http://download.csdn.net/detail/xiaowei_cqu/4443761



更多 7
30
0
主题推荐
opencv 迭代器 内存 指针 安全
猜你在找
我的OpenCV学习笔记(二):操作每个像素
OpenCv的连通域操作
计算机视觉目标检测的框架与过程
计算机视觉+图像处理的好的链接网站!不断更新中!!!!
【模式识别】多层感知器 MLP
图像处理与计算机视觉:基础,经典以及最近发展(5)计算机视觉
在实验室还是企业实习,这个无定数
学习OpenCV:滤镜系列(3)——颜色变幻
cvFindContours && cvDrawContours 的应用2-----图像内轮廓填充
Android NDK开发篇(一):新版NDK环境搭建(免Cygwin,超级快)
查看评论
18楼  aprhz 2013-11-01 12:48发表 [回复]
I.ptr<uchar>(i)是什么意思?
17楼  小魔大树哥 2013-10-17 17:01发表 [回复]
单通道(灰度图)的读取像素 最后像素值放在哪 table还是p中,初学者请教小魏,还有const uchar*const table[352*288];
uchar *p = I.data ;这两行代码过不去,类型不一致
16楼  byctw 2013-06-05 11:49发表 [回复]
请问:
Mat outfile; 要访问其第二个像素
用 outfile.data[1] 的语法是否也可以?
15楼  masikkk 2013-06-03 20:23发表 [回复]
知道什么是LUT了
14楼  cxchenxingcool 2013-04-18 00:14发表 [回复]
由IplImage*转到Mat,总感觉不适应,在二者之间只能IplImage与Mat互换
13楼  郑海波 2013-03-26 11:28发表 [回复]
楼主对android版的OpenCV可有研究?里面的Mat(java版)元素如何访问?
Re:  xiaowei_cqu 2013-03-26 13:12发表 [回复]
回复NUPTboyZHB:没用过
12楼  AaBb301 2012-12-03 21:05发表 [回复]
2了,看到下面原来里有介绍,呵呵
11楼  AaBb301 2012-12-03 20:28发表 [回复]
突然明白好像是”离散量化“的,请问博主是这个主要功能吗
Re:  xiaowei_cqu 2012-12-03 20:57发表 [回复]
回复AaBb301:嗯,用来减小颜色空间
Re:  AaBb301 2012-12-03 21:06发表 [回复]
回复xiaowei_cqu:嗯 谢谢博主
10楼  AaBb301 2012-12-03 20:21发表 [回复]
想问下博主,ScanImageAndReduceC函数参数里那个table有什么用啊,我刚学opencv,很多不懂
9楼  zhangnzhen 2012-11-20 13:27发表 [回复]
代码里lut的计时部分错了,t=(double)getTickCount()应该在代码执行前面。要不这速度也太发指了~
8楼  xiaojidan2011 2012-09-11 13:45发表 [回复]
哦哦哦哦 不好意思的 我刚刚调试了下的 单幅是可以显示的 成功了 嘻嘻 可能运行的时候占据内存太大了的原因的 ,搞不懂 了
7楼  xiaojidan2011 2012-09-11 13:41发表 [回复]
代码运行编译都没什么问题,局势显示的时候 窗口全部是灰色的,貌似图像的值没有传进去的
6楼  xiaojidan2011 2012-09-11 13:38发表 [回复]
写的很好的呀 但是我跑了代码 却显示不出图像,是怎么回事的呀
5楼  jizhihang2000 2012-09-07 14:00发表 [回复]
“另外要注意的是在三通道图像中我们定义的是 <Vec3b>格式的迭代器,如果定义成uchar,则只能访问到B即蓝色通道的值。”
为什么不是所有像素的所有通道都访问了一遍?
Re:  xiaowei_cqu 2012-09-07 14:37发表 [回复]
回复jizhihang2000:三通道像素是BRG排放的,相当于每个元素里放了三个uchar。迭代器定义成uchar只取出了第一个B的值,你可以试试
4楼  caiqi1123 2012-09-07 10:33发表 [回复]
才女:
代码
03. // accept only char type matrices 
04. CV_Assert(I.depth() != sizeof(uchar)); 
有问题吧?改为:
// accept only char type matrices 
CV_Assert(mat.depth() == CV_8U);
Re:  xiaowei_cqu 2012-09-07 10:42发表 [回复]
回复caiqi1123:我传递的参数是I;而且CV_8U不就是uchar的类型嘛
Re:  caiqi1123 2012-09-07 10:58发表 [回复]
回复xiaowei_cqu:回复caiqi1123:CV_8U 宏是0哦。sizeof(uchar)=8
mat.depth() 返回的是CV_8U。仅供探讨啊。
3楼  afery 2012-09-06 17:25发表 [回复]
有翻译版的看诶
2楼  meiqingfly 2012-07-23 13:28发表 [回复]
这个好呢。。
Re:  xiaowei_cqu 2012-07-23 14:11发表 [回复]
回复meiqingfly:没写什么,是tutorials里自带的例子
1楼  skiaazure 2012-07-23 07:45发表 [回复]
我还是习惯用at。。。
Re:  xiaowei_cqu 2012-07-23 08:46发表 [回复]
回复skiaazure:我也是,感觉直接用[]很危险
发表评论
  • 用 户 名:
  • wslz2001
  • 评论内容:
  • 插入代码
  •   
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
id="ad_frm_0" frameborder="0" scrolling="no" src="http://blog.csdn.net/common/ad.html?t=5&containerId=ad_bot&frmId=ad_frm_0" style="border-width: 0px; overflow: hidden; width: 746px; height: 0px;">
快速回复
  • 个人资料
  •  
    • 访问:644509次
    • 积分:11064分
    • 排名:第323名
    • 原创:139篇
    • 转载:0篇
    • 译文:1篇
    • 评论:1723条
  • 博客专栏
  • 博主简介
  • CS小硕一枚,兴趣领域:计算机视觉、媒体分析、图像处理;认知心理学,生理心理学。
    喜欢C++、Matlab、OpenCV、Qt、UML、VS、XMind等各种优秀的、提高码农生产力的工具。

    爱逛豆瓣
    <table cellspacing="0" cellpadding="4" center"="">

    我的邮箱
    weilan.cqu#gmail.com
  • 最新评论
公司简介| 招贤纳士| 广告服务| 银行汇款帐号| 联系方式| 版权声明| 法律顾问| 问题报告| 合作伙伴| 论坛反馈
网站客服  杂志客服  微博客服    400-600-2320
京 ICP 证 070598 号
北京创新乐知信息技术有限公司 版权所有
江苏乐知网络技术有限公司 提供商务支持
Copyright © 1999-2014, CSDN.NET, All Rights Reserved  GongshangLogo
  src="http://zz.csdn.net/bin/logs.php" frameborder="0" width="0" height="0">

 

【OpenCV】访问Mat图像中每个像素的值

分类: 【图像处理】   21945人阅读  评论(26)  收藏  举报

目录(?)[+]

今天百度搜资料还搜到了自己的。。。《访问图像中每个像素的值》,这是之前写的了,用的也是2.0的风格IplImage*格式,不太适用后来Mat的格式,特此重写一篇。

以下例子源自《The OpenCV Tutorials --Release 2.4.2》2.2 How to scan images, lookup tables and time measurement with OpenCV


图像容器Mat

还是先看Mat的存储形式。Mat和Matlab里的数组格式有点像,但一般是二维向量,如果是灰度图,一般存放 <uchar>类型;如果是RGB彩色图,存放 <Vec3b>类型。
单通道灰度图数据存放格式:

多通道的图像中,每列并列存放通道数量的子列,如RGB三通道彩色图:

注意通道的顺序反转了:BGR。通常情况内存足够大的话图像的每一行是连续存放的,也就是在内存上图像的所有数据存放成一行,这中情况在访问时可以提供很大方便。可以用  isContinuous()函数来判断图像数组是否为连续的。

访问图像中的像素


高效的方法:C操作符[ ]

最快的是直接用C风格的内存访问操作符[]来访问:
[cpp]  view plain copy
  1. Mat& ScanImageAndReduceC(Mat& I, const uchar* const table)  
  2. {  
  3.     // accept only char type matrices  
  4.     CV_Assert(I.depth() != sizeof(uchar));  
  5.     int channels = I.channels();  
  6.     int nRows = I.rows ;  
  7.     int nCols = I.cols* channels;  
  8.     if (I.isContinuous())  
  9.     {  
  10.         nCols *= nRows;  
  11.         nRows = 1;  
  12.     }  
  13.     int i,j;  
  14.     uchar* p;  
  15.     for( i = 0; i < nRows; ++i)  
  16.     {  
  17.         p = I.ptr<uchar>(i);  
  18.         for ( j = 0; j < nCols; ++j)  
  19.         {  
  20.             p[j] = table[p[j]];  
  21.         }  
  22.     }  
  23.     return I;  
  24. }  
注意: 书中这段代码是有问题的,前面写成了 
[cpp]  view plain copy
  1. int nRows = I.rows * channels;  
  2. int nCols = I.cols;  
一般情况 isContinous为true,运行不会出错,但你可以注释掉那个if,会有访问越界的问题。
这种访问形式就是在每行定义一个指针,然后在内存上直接连续访问。如果整个数组在内存上都是连续存放的,那么只需要定义一个指针就可以访问所有的数据!如单通道的灰度图访问方式如下:
[cpp]  view plain copy
  1. uchar* p = I.data;  
  2. for( unsigned int i =0; i < ncol*nrows; ++i)  
  3.     *p++ = table[*p];  

安全的方法:迭代器iterator

相比用指针直接访问可能出现越界问题,迭代器绝对是非常安全的方法:
[cpp]  view plain copy
  1. Mat& ScanImageAndReduceIterator(Mat& I, const uchar* const table)  
  2. {  
  3.     // accept only char type matrices  
  4.     CV_Assert(I.depth() != sizeof(uchar));  
  5.     const int channels = I.channels();  
  6.     switch(channels)  
  7.     {  
  8.     case 1:  
  9.         {  
  10.             MatIterator_<uchar> it, end;  
  11.             for( it = I.begin<uchar>(), end = I.end<uchar>(); it != end; ++it)  
  12.                 *it = table[*it];  
  13.             break;  
  14.         }  
  15.     case 3:  
  16.         {  
  17.             MatIterator_<Vec3b> it, end;  
  18.             for( it = I.begin<Vec3b>(), end = I.end<Vec3b>(); it != end; ++it)  
  19.             {  
  20.                 (*it)[0] = table[(*it)[0]];  
  21.                 (*it)[1] = table[(*it)[1]];  
  22.                 (*it)[2] = table[(*it)[2]];  
  23.             }  
  24.         }  
  25.     }  
  26.     return I;  
  27. }  
这里我们只定义了一个迭代器,用了一个for循环,这是因为在OpenCV里迭代器会访问每一列然后自动跳到下一行,不用管在内存上是否isContinous。另外要注意的是在三通道图像中我们定义的是 <Vec3b>格式的迭代器,如果定义成uchar,则只能访问到B即蓝色通道的值。
这种方式虽然安全,但是挺慢的,一会儿就知道了。

更慢的方法:动态地址计算

这种方法在需要连续扫描所有点的应用时并不推荐,因为它更实用与随机访问。这种方法最基本的用途是访问任意的某一行某一列:
[cpp]  view plain copy
  1. Mat& ScanImageAndReduceRandomAccess(Mat& I, const uchar* const table)  
  2. {  
  3.     // accept only char type matrices  
  4.     CV_Assert(I.depth() != sizeof(uchar));  
  5.     const int channels = I.channels();  
  6.     switch(channels)  
  7.     {  
  8.     case 1:  
  9.         {  
  10.             forint i = 0; i < I.rows; ++i)  
  11.                 forint j = 0; j < I.cols; ++j )  
  12.                     I.at<uchar>(i,j) = table[I.at<uchar>(i,j)];  
  13.             break;  
  14.         }  
  15.     case 3:  
  16.         {  
  17.             Mat_<Vec3b> _I = I;  
  18.   
  19.             forint i = 0; i < I.rows; ++i)  
  20.                 forint j = 0; j < I.cols; ++j )  
  21.                 {  
  22.                     _I(i,j)[0] = table[_I(i,j)[0]];  
  23.                     _I(i,j)[1] = table[_I(i,j)[1]];  
  24.                     _I(i,j)[2] = table[_I(i,j)[2]];  
  25.                 }  
  26.                 I = _I;  
  27.                 break;  
  28.         }  
  29.     }  
  30.     return I;  
  31. }  
因为这种方法是为随机访问设计的,所以真的是奇慢无比。。。

减小颜色空间 color space reduction

现在来介绍下上述函数对每个元素的操作,也就是用table更改像素值。这里其实是做了个减小颜色空间的操作,这在一些识别之类的应用中会大大降低运算复杂度。类如uchar类型的三通道图像,每个通道取值可以是0~255,于是就有 256*256个不同的值。我们可以通过定义:
0~9 范围的像素值为 0
10~19 范围的像素值 为 10
20~29 范围的像素值为 20
。。。。。。
着这样的操作将颜色取值降低为 26*26*26 种情况。这个操作可以用一个简单的公式:

来实现,因为C++中int类型除法操作会自动截余。 类如 Iold=14; Inew=(Iold/10)*10=(14/10)*10=1*10=10;
在处理图像像素时,每个像素需要进行一遍上述计算也需要一定的时间花销。但我们注意到其实只有 0~255 种像素,即只有256种情况。进一步可以把256种计算好的结果提前存在表中 table 中,这样每种情况不需计算直接从 table 中取结果即可。
[cpp]  view plain copy
  1. int divideWith=10;   
  2. uchar table[256];  
  3. for (int i = 0; i < 256; ++i)  
  4.     table[i] = divideWith* (i/divideWith);  
于是table[i]存放的是值为i的像素减小颜色空间的结果,这样也就可以理解上述方法中的操作:
[cpp]  view plain copy
  1. p[j] = table[p[j]];  

LUT : Look up table

OpenCV 很聪明的有个 LUT 函数就是针对这种 Look up talbe 的操作:
[cpp]  view plain copy
  1. Mat lookUpTable(1, 256, CV_8U);  
  2. uchar* p = lookUpTable.data;  
  3. forint i = 0; i < 256; ++i)  
  4.     p[i] = table[i];  
  5. for (int i = 0; i < times; ++i)  
  6.     LUT(I, lookUpTable, J);  

算法计时

为了验证几种方法的效率,可以用一个简单的计时和输出:
[cpp]  view plain copy
  1. double t;  
  2. t = (double)getTickCount();  
  3. t = 1000*((double)getTickCount() - t)/getTickFrequency();  
  4. t /= times;  

实验结果


原图:


降低颜色空间结果:


算法时间:


更清楚的时间对比表:


转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/7771760
实验代码下载:http://download.csdn.net/detail/xiaowei_cqu/4443761



更多 7
30
0
主题推荐
opencv 迭代器 内存 指针 安全
猜你在找
我的OpenCV学习笔记(二):操作每个像素
OpenCv的连通域操作
计算机视觉目标检测的框架与过程
计算机视觉+图像处理的好的链接网站!不断更新中!!!!
【模式识别】多层感知器 MLP
图像处理与计算机视觉:基础,经典以及最近发展(5)计算机视觉
在实验室还是企业实习,这个无定数
学习OpenCV:滤镜系列(3)——颜色变幻
cvFindContours && cvDrawContours 的应用2-----图像内轮廓填充
Android NDK开发篇(一):新版NDK环境搭建(免Cygwin,超级快)
width="728" height="90" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" id="aswift_0" name="aswift_0" style="left: 0px; position: absolute; top: 0px;">
查看评论
18楼  aprhz 2013-11-01 12:48发表 [回复]
I.ptr<uchar>(i)是什么意思?
17楼  小魔大树哥 2013-10-17 17:01发表 [回复]
单通道(灰度图)的读取像素 最后像素值放在哪 table还是p中,初学者请教小魏,还有const uchar*const table[352*288];
uchar *p = I.data ;这两行代码过不去,类型不一致
16楼  byctw 2013-06-05 11:49发表 [回复]
请问:
Mat outfile; 要访问其第二个像素
用 outfile.data[1] 的语法是否也可以?
15楼  masikkk 2013-06-03 20:23发表 [回复]
知道什么是LUT了
14楼  cxchenxingcool 2013-04-18 00:14发表 [回复]
由IplImage*转到Mat,总感觉不适应,在二者之间只能IplImage与Mat互换
13楼  郑海波 2013-03-26 11:28发表 [回复]
楼主对android版的OpenCV可有研究?里面的Mat(java版)元素如何访问?
Re:  xiaowei_cqu 2013-03-26 13:12发表 [回复]
回复NUPTboyZHB:没用过
12楼  AaBb301 2012-12-03 21:05发表 [回复]
2了,看到下面原来里有介绍,呵呵
11楼  AaBb301 2012-12-03 20:28发表 [回复]
突然明白好像是”离散量化“的,请问博主是这个主要功能吗
Re:  xiaowei_cqu 2012-12-03 20:57发表 [回复]
回复AaBb301:嗯,用来减小颜色空间
Re:  AaBb301 2012-12-03 21:06发表 [回复]
回复xiaowei_cqu:嗯 谢谢博主
10楼  AaBb301 2012-12-03 20:21发表 [回复]
想问下博主,ScanImageAndReduceC函数参数里那个table有什么用啊,我刚学opencv,很多不懂
9楼  zhangnzhen 2012-11-20 13:27发表 [回复]
代码里lut的计时部分错了,t=(double)getTickCount()应该在代码执行前面。要不这速度也太发指了~
8楼  xiaojidan2011 2012-09-11 13:45发表 [回复]
哦哦哦哦 不好意思的 我刚刚调试了下的 单幅是可以显示的 成功了 嘻嘻 可能运行的时候占据内存太大了的原因的 ,搞不懂 了
7楼  xiaojidan2011 2012-09-11 13:41发表 [回复]
代码运行编译都没什么问题,局势显示的时候 窗口全部是灰色的,貌似图像的值没有传进去的
6楼  xiaojidan2011 2012-09-11 13:38发表 [回复]
写的很好的呀 但是我跑了代码 却显示不出图像,是怎么回事的呀
5楼  jizhihang2000 2012-09-07 14:00发表 [回复]
“另外要注意的是在三通道图像中我们定义的是 <Vec3b>格式的迭代器,如果定义成uchar,则只能访问到B即蓝色通道的值。”
为什么不是所有像素的所有通道都访问了一遍?
Re:  xiaowei_cqu 2012-09-07 14:37发表 [回复]
回复jizhihang2000:三通道像素是BRG排放的,相当于每个元素里放了三个uchar。迭代器定义成uchar只取出了第一个B的值,你可以试试
4楼  caiqi1123 2012-09-07 10:33发表 [回复]
才女:
代码
03. // accept only char type matrices 
04. CV_Assert(I.depth() != sizeof(uchar)); 
有问题吧?改为:
// accept only char type matrices 
CV_Assert(mat.depth() == CV_8U);
Re:  xiaowei_cqu 2012-09-07 10:42发表 [回复]
回复caiqi1123:我传递的参数是I;而且CV_8U不就是uchar的类型嘛
Re:  caiqi1123 2012-09-07 10:58发表 [回复]
回复xiaowei_cqu:回复caiqi1123:CV_8U 宏是0哦。sizeof(uchar)=8
mat.depth() 返回的是CV_8U。仅供探讨啊。
3楼  afery 2012-09-06 17:25发表 [回复]
有翻译版的看诶
2楼  meiqingfly 2012-07-23 13:28发表 [回复]
这个好呢。。
Re:  xiaowei_cqu 2012-07-23 14:11发表 [回复]
回复meiqingfly:没写什么,是tutorials里自带的例子
1楼  skiaazure 2012-07-23 07:45发表 [回复]
我还是习惯用at。。。
Re:  xiaowei_cqu 2012-07-23 08:46发表 [回复]
回复skiaazure:我也是,感觉直接用[]很危险
发表评论
  • 用 户 名:
  • wslz2001
  • 评论内容:
  • 插入代码
  •   
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
快速回复
  • 个人资料
  •  
    • 访问:644509次
    • 积分:11064分
    • 排名:第323名
    • 原创:139篇
    • 转载:0篇
    • 译文:1篇
    • 评论:1723条
  • 博客专栏
  • 博主简介
  • CS小硕一枚,兴趣领域:计算机视觉、媒体分析、图像处理;认知心理学,生理心理学。
    喜欢C++、Matlab、OpenCV、Qt、UML、VS、XMind等各种优秀的、提高码农生产力的工具。

    爱逛豆瓣
    <table cellspacing="0" cellpadding="4" center"="">

    我的邮箱
    weilan.cqu#gmail.com
  • 最新评论
公司简介| 招贤纳士| 广告服务| 银行汇款帐号| 联系方式| 版权声明| 法律顾问| 问题报告| 合作伙伴| 论坛反馈
网站客服  杂志客服  微博客服    400-600-2320
京 ICP 证 070598 号
北京创新乐知信息技术有限公司 版权所有
江苏乐知网络技术有限公司 提供商务支持
Copyright © 1999-2014, CSDN.NET, All Rights Reserved  GongshangLogo
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值