平臺:win7+opencv2.4.4+vs2008
功能:實現對圖像的讀入、灰度化、歸一化和向量化。
代碼:
//這裏的頭文件都是vs2008的,與vc6.0有多不同
#include <opencv2\opencv.hpp>
#include<iostream>
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 <S; 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");//可加可不加
}
本代碼經本人調試均已通過,而且已得到應用。