平台:win7+opencv2.4.4+vs2008
功能:实现对图像的读入、灰度化、归一化和向量化。
代码:
//这里的头文件都是vs2008的,与vc6.0有多不同
#include
#include
using namespace std;
using namespace cv;
void main(int argc, char* argv[])
{
IplImage *src;
src = cvLoadImage("D:\\image.jpg"); //这里将lena.jpg和lena.cpp文件放在同一个文件夹下
cvNamedWindow("src",CV_WINDOW_AUTOSIZE);
cvMoveWindow("src",0,50);
cvShowImage("src",src);
//图像灰度化
IplImage* gray_image;
gray_image = cvCreateImage(cvGetSize(src),8,1);
cvCvtColor(src,gray_image,CV_BGR2GRAY);
//cvNamedWindow("gray",CV_WINDOW_AUTOSIZE);
//cvMoveWindow("gray",100,100);
//cvShowImage("gray",gray_image);
//尺度归一化
IplImage* norm_image;
CvSize norm_cvsize;
norm_cvsize.width = 100; //目标图像的宽
norm_cvsize.height = 100; //目标图像的高
norm_image = cvCreateImage(norm_cvsize, gray_image->depth,gray_image->nChannels); //构造目标图象
cvResize(gray_image, norm_image, CV_INTER_LINEAR); //缩放源图像到目标图像
//cvNamedWindow("norm",CV_WINDOW_AUTOSIZE);
//cvMoveWindow("norm",150,150);
//cvShowImage("norm",norm_image);
//图像转化成矩阵
CvMat* norm_mat = cvCreateMat(norm_image->height,norm_image->width,CV_32FC1);//定义一个指向CvMat对象的指针
cvConvert(norm_image,norm_mat);
//变成行向量(默认为行向量)
CvMat vecHead,*vecRow;
vecRow=cvReshape( norm_mat, &vecHead, 0, 1 );//vec是得到的一维向量
//矩阵转置从而得到列向量
CvMat* col_mat = cvCreateMat(norm_image->height,norm_image->width,CV_32FC1);
cvTranspose( norm_mat, col_mat );
//变成列向量(获得列向量需要装置矩阵)
CvMat colHead,*vecCol;
vecCol=cvReshape( col_mat, &colHead, 0, 1 );//得到的一维向量
//显示向量元素
int S=norm_cvsize.width*norm_cvsize.width;
//给列向量赋值
float c=0,col[10000]={0};
float *p;//获得矩阵元素(0,0)的指针
p = (float*)cvPtr1D(vecCol, 0,0);
for(int i = 0; i
{
//printf("%f\t",*p/255);
col[i]=*p/255;
c=col[i];
printf("%f\t",c);
p++;
}
cvWaitKey(0);//按需要0课改为任意值
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&gray_image);
cvReleaseImage(&norm_image);
cvReleaseMat(&norm_mat);
system("pause");//可加可不加
}
本代码经本人调试均已通过,而且已得到应用。