首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载、显示和转换多张图片

加载、显示和转换多张图片
EN

Stack Overflow用户
提问于 2011-12-17 19:43:18
回答 1查看 742关注 0票数 0

我开始用OpenCV编写我的第一个C++程序,我想将一组图像(存储在我的项目中,名为"brain_mri_001.jpg -> brain_mri_015.jpg“)表示为长度为LxL的向量,其中L是x(y)方向上的像素数。以下是我的代码:

代码语言:javascript
复制
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
using namespace std;

int main()
    {
        //load images
        for(int i=1; i<=25; i++)
            {
                char filename[50];
                sprintf( filename, "brain_mri_%d.jpg", i ); 
                IplImage *img=cvLoadImage( filename, CV_LOAD_IMAGE_GRAYSCALE);
                if (!img)   
                    {
                        printf("Error: Image not found.\n");
                        return 2; //error : not found image
                    }

                cvNamedWindow("Projet Image", CV_WINDOW_AUTOSIZE);// create a window
                IplImage *img2=cvCloneImage(img); //clone img
                cvShowImage("Projet Image", img2); // display the image in a window

                cvWaitKey(0); //attendre touche
                cvDestroyWindow("Projet Image"); // destroy the window
                cvReleaseImage(&img); // memory

                return 0; //finish with success

                //convert IplImage -> Matrix 
                int height = img->height;  
                int width = img->width; 
                CvMat *mat = cvCreateMat(height,width,CV_32FC3);

                //convert Matrix -> Vector 
                //CvMat row_header, *row;
                //row = cvReshape(mat, &row_header, 0, 1);
                CvMat vector_header;
                cvReshape(img, &vector_header, 0, 1);

                //check the height and width of vector_header
                if(vector_header.height != 1)
                    {
                        fprintf(stderr, "vector_header's height is %d\n", vector_header.height);
                    }
                if(vector_header.width != width*height)
                    {
                        fprintf(stderr, "vector_header's width is %d\n", vector_header.width);
                    }
            }
    }

我应该犯了一个错误,但我不知道在哪里:(如果有人能回答我,我将不胜感激!另外,请原谅我糟糕的英语。

EN

回答 1

Stack Overflow用户

发布于 2011-12-18 05:14:47

我认为你需要做的是a)当你处理完你的图像时cvReleaseImage它们,2)你的重塑代码应该是这样的

代码语言:javascript
复制
CvMat vector_header;
cvReshape(img2, &vector_header, 0, 1); /* same # of channels, 1 row */

请注意,cvReshape不复制数据,因此vector_header不需要与cvCreateMat一起分配。我不确定如何测试它,除了尝试加载一个非常小的图像并将其值绘制到stdout。作为一个健全性检查,您可以检查vector_header的heightwidth,如下所示

代码语言:javascript
复制
if(vector_header.height != 1)
{
    fprintf(stderr, "vector_header's height is %d\n", vector_header.height);
}
if(vector_header.width != width*height)
{
    fprintf(stderr, "vector_header's width is %d\n", vector_header.width);
}

在高度和宽度方面,我可能会把它倒过来。我也不能100%确定重塑过程,例如,如果你的图像是1 2;3 4,那么得到的向量是1 2 3 4还是1 3 2 4?如果你正在做像PCA这样的事情(例如,特征脸算法),那么只要它是一致的,它就可能无关紧要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8544485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档