我开始用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);
}
}
}我应该犯了一个错误,但我不知道在哪里:(如果有人能回答我,我将不胜感激!另外,请原谅我糟糕的英语。
发布于 2011-12-18 05:14:47
我认为你需要做的是a)当你处理完你的图像时cvReleaseImage它们,2)你的重塑代码应该是这样的
CvMat vector_header;
cvReshape(img2, &vector_header, 0, 1); /* same # of channels, 1 row */请注意,cvReshape不复制数据,因此vector_header不需要与cvCreateMat一起分配。我不确定如何测试它,除了尝试加载一个非常小的图像并将其值绘制到stdout。作为一个健全性检查,您可以检查vector_header的height和width,如下所示
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这样的事情(例如,特征脸算法),那么只要它是一致的,它就可能无关紧要。
https://stackoverflow.com/questions/8544485
复制相似问题