我开始用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);
}
}
}
我应该犯错,但我不知道在哪里:( 如果有人能回答我,我将不胜感激! 附:请原谅我糟糕的英语......
答案 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的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的事情(例如,特征脸算法),那么只要它是一致的就没关系。