1. 程式人生 > >使用OpenCV畫折線圖

使用OpenCV畫折線圖

      使用OpenCV畫直方圖是一件輕鬆的事情,畫折線圖就沒有那麼Easy了,還是使用一個庫吧:

   GraphUtils 原始碼新增入工程

       使用的畫圖程式碼:

//使用一個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;
}

最終的簡單顯示效果: