使用OpenCV画直方图是一件轻松的事情,画折线图就没有那么Easy了,还是使用一个库吧:
GraphUtils 源代码添加入工程
原文链接:http://www.360doc.com/content/14/0424/12/16961511_371674057.shtml
使用的画图代码:
//使用一个OpenCV的画图库
#include "GraphUtils.h"
//显示文本里面的模式曲线
void CPicToolsDlg::OnBnClickedButtonShowpattern()
{
//打开目录文件
CFileDialog FileDlg(
TRUE, _T("*.pcd"), NULL,
OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,
_T("*.txt|*.txt| *.pcd|*.pcd| All Files (*.*) |*.*||"), NULL);//选取约定!
FileDlg.m_ofn.lpstrTitle = _T("打开待显示模式文本!!!"); // 打开文件对话框的标题名
if (FileDlg.DoModal() != IDOK) {
MessageBox("打开文件失败!!!请重新检测", "提示", 0);
return ;
}
CString FilePath = FileDlg.GetPathName();
std::string MyFileName = FilePath;
//读取文本到序列
std::vector<cv::Point3f > Seq(0);
this->readTxt2Seq(MyFileName,Seq);
//显示文本为模式
//使用三维显示
this->showFeature3f(Seq );
return;
}
//使用OpenCV显示三维序列
//暂时显示一维,三维的太困难了!
//显示一维曲线,最后显示多个,人工分析模式
bool CPicToolsDlg::showFeature3f(std::vector<cv::Point3f > &Seq )
{
//画一个曲线//使用三色桌布吧,同时画出x,y,z
cv::Mat CanvasM(480,800,CV_8UC3);
//CanvasM.
CanvasM= cv::Mat::zeros(480,800,CV_8UC3);//全黑背景
IplImage C =CanvasM;
cvNot(&C,&C);//反色
cv::Mat Canvas(&C);
CanvasM =Canvas.clone();//克隆
std::string BarName="特征的折线图";
int nArrayLength = Seq.size();
float *Array = new float[nArrayLength];
int delay_ms = 10;
for (int i=0;i< nArrayLength;++i)
{
Array[i] = 479 -Seq[i].x ;
}
drawLineGraph(BarName,Array, nArrayLength, delay_ms);
return true;
}
//使用空白画图板
int CPicToolsDlg::drawLineGraph(
std::string BarName,float *array, int nArrayLength, int delay_ms)
{
//使用画图工具
const char *name = BarName.c_str();
const float *arraySrc = array;
IplImage *background = NULL;
//nArrayLength =100;
showFloatGraph(name, arraySrc, nArrayLength, delay_ms, background);
return 1;
}
//读取文本浮点数到三元组 序列
bool CPicToolsDlg::readTxt2Seq(
std::string TxtName, std::vector<cv::Point3f > &Seq )
{
std::string TestTxt(TxtName); //
freopen(TestTxt.c_str(),"r",stdin);// 打开文件!
//三元组,使用三元组逐个写入
float ViewValue,ViewValue2,ViewValue3;
cv::Point3f P(0,0,0);
Seq.resize(0);
while (std::cin)
{
std::cin >>ViewValue; // 利用 重定向输入 浮点值
std::cin >>ViewValue2;
std::cin >>ViewValue3;
P.x = ViewValue;
P.y = ViewValue2;
P.z = ViewValue3;
Seq.push_back(P);
}
return true;
}
最终的简单显示效果: