Сопоставление с шаблоном. Почему результирующая матрица меньше указанной?

Итак, я выполняю сопоставление шаблона для определенной области из входного изображения, используя OpenCVCameraView. Ниже показано, как выглядит мой код.

Mat input;
Rect bigRect = ...; //specific size

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    input = inputFrame.rgba();
    ...
}

public void Template(View view) {
    Mat mImage = input.submat(bigRect);
    Mat mTemplate = Utils.loadResource(this, R.id.sample, Highgui.CV_LOAD_IMAGE_COLOR);
    Mat mResult = new Mat(mImage.rows(), mImage.cols(), CvType.CV_32FC1); // I use the same size as mImage because mImage's size is already smaller than inputFrame

    Imgproc.cvtColor(mImage, mImage, Imgproc.COLOR_RGBA2RGB); //convert is needed to make mImage and mTemplate to be the same type

    Imgproc.matchTemplate(mImage, mTemplate, mResult, match_method);        
    Core.normalize(mResult, mResult, 0, 1, Core.NORM_MINMAX, -1, new Mat());

    mResult.convertTo(mResult, CvType.CV_8UC1); // I convert the matrix because I need to show it to imageview via bitmap

    Bitmap bmResult1 = Bitmap.createBitmap(mImage.width(), mImage.height(), Bitmap.Config.RGB_565);
    Bitmap bmResult2 = Bitmap.createBitmap(mResult.width(), mResult.height(), Bitmap.Config.RGB_565);
    Utils.matToBitmap(mImage, bmResult1);
    Utils.matToBitmap(mResult, bmResult2);
    ImageView1.setImageBitmap(bmResult1);
    ImageView2.setImageBitmap(bmResult2);
}

Я пытаюсь вывести матрицу с помощью toString() и получил следующие результаты:

mImage: Mat [250*178*CV_8UC3, isCont=true, isSubmat=false, ...]
mResult: Mat [180*94*CV_8UC1, isCont=true, usSubmat=false, ...]

И мои вопросы:

  1. Почему размер mResult меньше размера mImage, несмотря на то, что уже объявлено, что размер mResult основан на размере mImage?
  2. Оказывается, при использовании типа CV_8UC1 содержимое доступно только в черном или белом цвете, в то время как mResult должен иметь плавающее значение, но метод Utils.matToBitmap не поддерживает типы матов, кроме CV_8UC1, CV_8UC3 и CV_8UC4. Есть ли способ показать CV_32FC1 растровому изображению, что он показывает реальную шкалу серого mResult?

person Affan Widyan    schedule 18.05.2015    source источник
comment
Документация opencv говорит: result – Map of comparison results. It must be single-channel 32-bit floating-point. If image is W \times H and templ is w \times h , then result is (W-w+1) \times (H-h+1) . поэтому я думаю, что ваш шаблон имеет размер [69, 83] ??   -  person Micka    schedule 18.05.2015


Ответы (1)


Почему размер mResult меньше, чем mImage, несмотря на то, что уже объявлено, что размер mResult основан на размере mImage?

Поскольку сопоставление с шаблоном в основном является пространственной сверткой, при выполнении изображений высотой H и h результатом будет H-h+1. То же самое с шириной результата (W-w+1). Но вы все равно можете resizeвернуть результат к (mImage.rows(), mImage.cols()) после сопоставления с шаблоном.

Оказывается, при использовании типа CV_8UC1 содержимое доступно только в черном или белом цвете, в то время как mResult должен иметь плавающее значение, но метод Utils.matToBitmap не поддерживает типы матов, отличные от CV_8UC1, CV_8UC3 и CV_8UC4. Есть ли способ показать CV_32FC1 растровому изображению, что он показывает реальную шкалу серого mResult?

Ключ в этих двух строках, я думаю:

Core.normalize(mResult, mResult, 0, 1, Core.NORM_MINMAX, -1, new Mat());
mResult.convertTo(mResult, CvType.CV_8UC1); // I convert the matrix because I need to show it to imageview via bitmap

Разве вы не можете просто нормализовать его, чтобы он принимал значения от 0 до 255?

Core.normalize(mResult, mResult, 0, 255, Core.NORM_MINMAX, -1, new Mat());
person Яois    schedule 18.05.2015
comment
изменение размера результата, вероятно, опасно для интерпретации, если результаты. За исключением того, что вы точно знаете, почему вы хотели это сделать. - person Micka; 18.05.2015
comment
Может представительство? Я не знаю. Как вы говорите, вероятно, это не рекомендуется, но если ОП хочет, чтобы он был такого размера, я просто указал, как это сделать. - person Яois; 18.05.2015
comment
Я посмотрел учебник по OpenCV здесь, и он похоже, что результат Mat имеет тот же размер, что и изображение Mat, поэтому я подумал, что он выглядит лучше для представления. - person Affan Widyan; 22.05.2015
comment
@AffanWidyan посмотрите пункт 7 этого урока: int result_cols = img.cols - templ.cols + 1; int result_rows = img.rows - templ.rows + 1; ;) - person Яois; 22.05.2015