2015-12-11 61 views
1

我試圖讓一些C++代碼在我的Android設備上運行;然而,我遇到了我使用的Mat類型的一個小問題。我想轉換的代碼如下(第二個函數調用第一):CV_32SC1:OpenCV C++ calcHist到Java

static Mat 
histc_(const Mat& src, int minVal=0, int maxVal=255, bool normed=false) 
{ 
    Mat result; 
    // Establish the number of bins. 
    int histSize = maxVal-minVal+1; 
    // Set the ranges. 
    float range[] = { static_cast<float>(minVal), static_cast<float>(maxVal+1) }; 
    const float* histRange = { range }; 
    // calc histogram 
    calcHist(&src, 1, 0, Mat(), result, 1, &histSize, &histRange, true, false); 
    // normalize 
    if(normed) { 
     result /= (int)src.total(); 
    } 
    return result.reshape(1,1); 
} 

static Mat histc(InputArray _src, int minVal, int maxVal, bool normed) 
{ 
    Mat src = _src.getMat(); 
    switch (src.type()) { 
     case CV_8SC1: 
      return histc_(Mat_<float>(src), minVal, maxVal, normed); 
      break; 
     case CV_8UC1: 
      return histc_(src, minVal, maxVal, normed); 
      break; 
     case CV_16SC1: 
      return histc_(Mat_<float>(src), minVal, maxVal, normed); 
      break; 
     case CV_16UC1: 
      return histc_(src, minVal, maxVal, normed); 
      break; 
     case CV_32SC1: 
      return histc_(Mat_<float>(src), minVal, maxVal, normed); 
      break; 
     case CV_32FC1: 
      return histc_(src, minVal, maxVal, normed); 
      break; 
     default: 
      CV_Error(Error::StsUnmatchedFormats, "This type is not implemented yet."); break; 
    } 
    return Mat(); 
} 

現在,因爲我喜歡的類型是永遠不變的我的Java代碼合併這兩個函數爲1。

private Mat histc(Mat src, int minVal, int maxVal) 
{ 
    Mat result = new Mat(); 

    MatOfInt histSize = new MatOfInt(maxVal - minVal + 1); 

    MatOfFloat histRange = new MatOfFloat(minVal, maxVal + 1); 
    MatOfInt channels = new MatOfInt(0); 
    Log.d(TAG, "Type: " + CvType.typeToString(src.type())); 
    src.convertTo(src, CvType.CV_32S); 
    Imgproc.calcHist(Arrays.asList(src), channels, new Mat(), result, histSize, histRange); 

    return result.reshape(1,1); 
} 

我得到一個錯誤OpenCV Error: Unsupported format or combination of formats() in void cv::calcHist,我從另一個問題,這是因爲我的src矩陣的類型是CV_32SC1發現。所以我的問題是,我不知道如何將這些線正確地轉換從第二C++函數爲Java:

case CV_32SC1: 
     return histc_(Mat_<float>(src), minVal, maxVal, normed); 
     break; 

我試圖找出如何在Java中做同樣的事情到Mat_<float>(src)明確。

參考:here是鏈接到整個代碼是什麼我想現在

回答

1
Mat_<float>(src) 

做的只是創建類型CV_32F與SRC內容的新的墊目標所要求的calcHist

所以應該足以做

src.convertTo(src, CvType.CV_32F); 
+0

,完美的工作!謝謝你......這太簡單了。 – user3709119