加载,显示和转换多个图像

时间:2011-12-17 11:43:18

标签: c++ opencv

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

#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);
                    }
            }
    }

我应该犯错,但我不知道在哪里:( 如果有人能回答我,我将不胜感激! 附:请原谅我糟糕的英语......

1 个答案:

答案 0 :(得分:0)

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

CvMat vector_header;
cvReshape(img2, &vector_header, 0, 1); /* same # of channels, 1 row */

请注意,cvReshape不会复制数据,因此vector_header不需要与cvCreateMat一起分配。我不知道如何测试这个,除了尝试加载一个非常小的图像并将其值绘制到stdout。作为完整性检查,您可以查看vector_header的heightwidth,例如

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的事情(例如,特征脸算法),那么只要它是一致的就没关系。