2016-12-24 74 views
0

我是新來的OpenCV SVM。有沒有一種方法來繪製圖形或開發由OpenCV的SVM制定了訓練的數據集的一些視頻內容,這樣我可以檢查我的訓練數據的準確性和調整我SVM相應的參數?繪製可視化圖OpenCV的SVM數據集

+0

OpenCV不會具有內置的功能來繪製...你最好保存數據的非CSV和Matlab中繪製它們或類似 – Miki

+0

我有YML和xml文件OpenCV的產生。但我無法弄清楚如何解析它使用matlab /八度。 – molecule

回答

1

這是可能的可視化的SVM響應,並可以使用OpenCV的繪圖功能來完成。

這個問題已經是老的,但它在谷歌搜索結果的可視化SVM高出現。我回答任何可能會發現這個問題的人。

有一個SVM教程,這裏的示例代碼: https://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

它包含一個代碼用於可視化什麼SVM瞭解到。請注意,此示例顯示了飛機上的數據,因此只有在您的數據是2D時才能使用。

因此,下面的代碼(它來自鏈接的OpenCV文檔)創建一個512 x 512像素的圖像,並檢查每個像素是否屬於一個類或另一個類(響應1或-1)。最重要的是,數據點被標記出來,以便您能夠看到SVM分類是否正常工作。

// Train the SVM 
CvSVM SVM; 
SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params); 

Vec3b green(0,255,0), blue (255,0,0); 
// Show the decision regions given by the SVM 
for (int i = 0; i < image.rows; ++i) 
    for (int j = 0; j < image.cols; ++j) 
    { 
     Mat sampleMat = (Mat_<float>(1,2) << j,i); 
     float response = SVM.predict(sampleMat); 

     if (response == 1) 
      image.at<Vec3b>(i,j) = green; 
     else if (response == -1) 
      image.at<Vec3b>(i,j) = blue; 
    } 

// Show the training data 
int thickness = -1; 
int lineType = 8; 
circle(image, Point(501, 10), 5, Scalar( 0, 0, 0), thickness, lineType); 
circle(image, Point(255, 10), 5, Scalar(255, 255, 255), thickness, lineType); 
circle(image, Point(501, 255), 5, Scalar(255, 255, 255), thickness, lineType); 
circle(image, Point(10, 501), 5, Scalar(255, 255, 255), thickness, lineType); 

如果您的數據點是整數對,這是一個很好的方法。如果你有float數據點,你需要決定你想要的可視化分辨率,並使像素不是1×1塊,但是你的最低分辨率要求(例如5.0e-27 x 2.0e-24)

+0

感謝隊友..我做一些非常不同的現在這麼着,現在試試。但肯定會檢查它是否有效。即使它幫助別人,我也會接受答案。 – molecule

+0

嗨@molecule,你試過這個嗎?如果它回答你的問題,你可以接受答案。 –

+0

嗨,我現在接受答案,直到有人說它不起作用。 – molecule