使用OpenCV畫折線圖
阿新 • • 發佈:2019-02-05
使用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; }
最終的簡單顯示效果: