如何在openCV中获取像素矩阵和重塑矩阵

Posted

技术标签:

【中文标题】如何在openCV中获取像素矩阵和重塑矩阵【英文标题】:How to get a matrix of pixels and reshape matrix in openCV 【发布时间】:2012-03-09 06:45:10 【问题描述】:

我正在使用 openCV 在 C++ 中实现图像处理算法,其中第一步需要将图像转换为矩阵。我知道当图像加载到 openCV 中时,它已经存储为矩阵。我使用的图像大小为 80 x 60,所以我假设它存储的矩阵大小为 80 x 60。但是,我希望首先能够看到这个矩阵,然后能够重塑它变成一个具有相同编号的矩阵。像素,但作为一长列。即 80 x 60 矩阵现在将变为 4800 x 1 矩阵。我曾尝试研究教科书和在线,但无济于事。到目前为止,这是我的代码。在任何情况下,它都不起作用,因为我无法从 'IplImage *' 转换为 'CvMat * 但我应该如何在创建矩阵后将我的像素值分配给它?请,如果有人可以帮助我使用此代码,我将不胜感激。

#include "cv.h"
#include "highgui.h"
#include "iostream"

using namespace std;
int main( int argc, char* argv ) 
IplImage* img0 = NULL;
CvMat* img0_mat = NULL ;
img0 = cvLoadImage("C:\\new\\walk mii.jpg");
if (!img0)
    return -1;
img0_mat = cvCreateMat(80, 60, 1);
img0_mat = img0;
cout <<" matrix " << img0 << endl;

cvWaitKey(0);
return 0;

【问题讨论】:

作为一个信息:opencv 不会将图像存储在int[][] 意义上的矩阵中。在内部它只使用一个维度,例如char[] 【参考方案1】:

您可以拨打Mat::reshape(int cn, int rows=0):

该方法为 *this 元素创建一个新的矩阵标题。新矩阵可能具有不同大小和/或不同数量的通道。任何组合都是可能的,只要:

1) 新矩阵中不包含任何额外元素,也不排除任何元素。最后, 产品

2) rows*cols*channels() 必须在转换后保持不变。

没有数据被复制,即这是 O(1) 操作。因此,如果您更改行数,或者操作以其他方式更改元素的行索引,则矩阵必须是连续的。参见 Mat::isContinuous() 。

...看起来你使用的是旧版本的库,所以你想要cvReshape。这样的事情应该可以工作:

#include "cv.h" 
#include "highgui.h" 
#include "iostream" 
using namespace std; 

int main( int argc, char* argv ) 
 
    IplImage* img0 = NULL; 
    CvMat* img0_mat = NULL ; 
    img0 = cvLoadImage("C:\\new\\walk mii.jpg"); 
    img0_mat = cvCreateMat(80, 60, 1); 

    CvMat row_header, *row;
    row = cvReshape( img0_mat, &row_header, 0, 1 );

    cout << " matrix " << row->tostring() << endl; 

    cvWaitKey(0); 
    return 0;

【讨论】:

这可能也很有趣:***.com/questions/7125452/… 非常感谢凯奇先生的帮助。您的代码有效。但是,输出是矩阵 0032FC38。我希望我不是在问一个愚蠢的问题,但我已经很沮丧了。行数不应该是4800吗?另外,如何将 img0 图像的像素值放入创建的 img0_mat 矩阵中? 0032FC38 将是行的指针地址而不是内容。如果您阅读 cvReshape 文档,它会告诉您它没有分配更多存储空间;它只是提供了一种访问数据的新方法。 如果你想打印内容,试试这个:***.com/questions/7970988/…(在你的情况下,你会想要将cout &lt;&lt;" matrix " &lt;&lt; row &lt;&lt; endl;更改为cout &lt;&lt;" matrix " &lt;&lt; *row &lt;&lt; endl;以取消引用指针)。 谢谢:) 但是,当我尝试构建它时,我收到一条错误消息 - 未找到采用“CvMat”类型的右手操作数的运算符(或者没有可接受的转换)。你知道如何解决这个问题吗?

以上是关于如何在openCV中获取像素矩阵和重塑矩阵的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 矩阵的掩膜操作

如何用opencv提取一张图片的像素矩阵

android opencv 如何获得特定像素点的颜色

如何在opencv中获取矩阵的一部分

OpenCV如何获取GLCM灰度共生矩阵

如何将 RotatedRect 中的所有像素存储到另一个矩阵?