OpenCV C ++ calcHist для Java

Я пытаюсь заставить работать некоторый код на С ++ на моем устройстве Android; Тем не менее, я сталкиваюсь с небольшой проблемой с типом Mat Я использую. Код, который я пытаюсь преобразовать, выглядит следующим образом (вторая функция вызывает первую):

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 объединил эти две функции в одну, поскольку мой тип всегда один и тот же: 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 специально.

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

1

Решение

Mat_<float>(src)

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

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

src.convertTo(src, CvType.CV_32F);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]