2015-12-11 5 views
1

Я пытаюсь получить код C++ для запуска на моем устройстве Android; однако, я столкнулся с небольшой проблемой с типом Mat, который я использую. Код, который я пытаюсь преобразовать это следующим образом (вторая функция вызывает первая):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-код объединил эти 2 функции в 1, так как мой тип всегда одинаков: CV_32SC1.

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; 

Я пытаюсь выяснить, как сделать что-то похожее на Mat_<float>(src) в Java специально.

Для справки: here ссылка на весь код для того, что я пытаюсь сделать прямо сейчас

ответ

1
Mat_<float>(src) 

просто создает новый объект Mat типа CV_32F с содержанием Src, в соответствии с требованиями calcHist.

Так оно и должно быть достаточно, чтобы сделать

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

Это работало отлично! Спасибо за это ... это было так просто исправить. – user3709119

Смежные вопросы