您的位置:首页 > 运维架构

vs2010+opencv调试

2014-05-08 22:39 495 查看
导师布置的pca的算法,要求用c++完成,现在已经到了求特征值特征向量的部分。这部分导师推荐调用opencv代码。

于是,配置了vs2010+opencv,一波三折,今天总算已经很接近成功了。

先后遇见了这几个问题:
http://www.cnblogs.com/GWeuro/archive/2012/12/21/2828035.html http://bbs.csdn.net/topics/340207150 http://bbs.csdn.net/topics/320005477
然后我要重新装了,但愿不会死得惨。

先把源码PO出来

注释掉的部分是pca,active的部分是opencv的测试程序,目的为输出一张图片。

等待拷vs安装包的时间,我又试了把opencv改成x86版,把平台也换成x86,会提示找不到.dll。win32也是这个情况。换成x64就提示不匹配。

看来应该是我必须用64位的,可我电脑只是64位处理器,系统还是32位啊,非常不解。

安装包拷好了,重装一遍选64位编译器试一下,不行就实在没招了。

// pca.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include"stdlib.h"
#include<fstream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;

int main(int argc, char** argv)
{

//read an image
if ( argc != 2 )
{
cout << "Usage: display_image ImageToLoadAndDisplay" << endl;
return -1;
}
Mat image;
cout << "size: " << image.size().height << " , "
<< image.size().width << endl;

// Read the file
image = imread(argv[1], CV_LOAD_IMAGE_COLOR);

// Check for invalid input
if (!image.data)
{
cout << "Could not open or find the image" << endl;
return -1;
}

// Show our image inside it.
imshow("Display window", image);

//Wait for a keystroke in the window
waitKey(0);

/*
//每张图的特征,样本大小dim,假设50*50
int i,j,k,dim=2500;
//图的个数,假设200张图
int number = 200;
double **data;
double *sumdata;
double *averdata;
double **diffdata;
double **covdata;
double **difftdata;
ofstream fout("data.txt");
ofstream fout2("averdata.txt");
ofstream fout3("diffdata.txt");
ofstream fout4("difftdata.txt");
ofstream fout5("covdata.txt");

//随机生成图像矩阵,每一行为一张图的数据
//200*2500
data=new double*[number];
for(i=0;i<number;i++)         //溢出的原因,原来是dim
data[i]=new double[dim];
if(!fout){
cout<<"open error!"<<endl;
exit(1);
}
for(i=0;i<number;i++){
for(j=0;j<dim;j++){
data[i][j]=rand()/100;
fout<<data[i][j]<<" ";
}
fout<<endl;
}
fout.close();
fout.clear();
cout<<"----random done----"<<endl;

//每行相加,再除以图数,求平均值;计算训练图片的平均脸
//1*2500
sumdata=new double[dim];
averdata=new double[dim];
if(!fout2){
cout<<"open error!"<<endl;
exit(1);
}
for(j=0;j<dim;j++)           //初始化
sumdata[j]=0;            //初始化
for(j=0;j<dim;j++)
for(i=0;i<number;i++)
sumdata[j]+=data[i][j];
for(i=0;i<dim;i++){
averdata[i]=sumdata[i]/number;
fout2<<averdata[i]<<" ";
}
fout2.close();
fout2.clear();
delete sumdata;

cout<<"----aver done----"<<endl;

//差值脸,200*2500
diffdata=new double*[number];
for(i=0;i<number;i++){          //溢出的原因,原来是dim
diffdata[i]=new double[dim];
}
if(!fout3){
cout<<"open error!"<<endl;
exit(1);
}
for(i=0;i<number;i++){
for(j=0;j<dim;j++){
diffdata[i][j]=data[i][j]-averdata[j];
fout3<<diffdata[i][j]<<" ";    //[i][j]
}
fout3<<endl;
}
fout3.close();
fout3.clear();
cout<<"----diff done----"<<endl;

//求转置矩阵 difftdata 2500*200
difftdata = new double*[dim];
for(i=0;i<dim;i++)
{
difftdata[i]=new double[number];
}
for(i=0;i<number;i++)
for(j=0;j<dim;j++){
difftdata[j][i]=diffdata[i][j];
}
for(i=0;i<dim;i++){
for(j=0;j<number;j++){
fout4<<difftdata[i][j]<<" ";
}
fout4<<endl;
}
fout4.close();
fout4.clear();
cout<<"----difft done----"<<endl;

//构建协方差矩阵 diff*difft
//200*2500 * 2500*200 = 200*200
covdata=new double*[number];
for(i=0;i<number;i++){
covdata[i]=new double[number];
}
//乘法计算结果与matlab计算出的有均值为 6.0883e-004 的误差,且主对角线差别很大
for(i=0;i<number;i++)
for(j=0;j<number;j++)
{
covdata[i][j]=0;
for(k=0;k<dim;k++)
covdata[i][j]+=diffdata[i][k]*difftdata[k][j];
}

for(i=0;i<number;i++){
for(j=0;j<number;j++){
fout5<<covdata[i][j]<<" ";
}
fout5<<endl;
}
fout5.close();
fout5.clear();
cout<<"----cov done----"<<endl;

//调用opencv求特征值和特征向量,并排序

delete [] data;
delete [] averdata;
delete [] diffdata;
delete [] difftdata;
delete [] covdata;
*/
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv pca