2013-05-14 4 views
2

У меня возникли проблемы с использованием метода setTo(). Мой код выглядит следующим образом:opencv настройка подматрицы Mat на другую Mat

ArrayList<Mat> someImagesOfSameSize = new ArrayList<Mat>; 
someImagesOfSameSize.add(img1); 
someImagesOfSameSize.add(img3); 
someImagesOfSameSize.add(img3); 
Mat combinedImagesOfSameSize = new Mat(new Range(0,30), new Range(0,100*someImagesOfSameSize.size()),3); 
Mat tempImage = null; 
for(int i = 0; someImagesOfSameSize.size();i++){ 
    tempImage = someImagesOfSameSize.get(i); 
    combinedImagesOfSameSize.submat(new Range(0,30), new Range(i*100,(i+1)*100)).setTo(tempImage) 
} 

Это дает мне OpenCV Error:

* OpenCV Ошибка: не удалось (Assertion checkScalar (значение, тип(), _value.kind(), _InputArray :: MAT)) в
неизвестная функция, файл ...... \ src \ opencv \ modules \ core \ src \ copy.cpp, строка 348 Исключение в потоке "main" CvException [org.opencv.core.CvException: .. .... \ src \ opencv \ modules \ core \ src \ copy.cpp: 348: error: (-215) checkScalar (значение, тип(), _value.kind(), _InputArray :: MAT)] в org. opencv.core.Mat.n_setTo (Нативный метод) на org.opencv.core.Mat.setTo (Mat.java:2164) *

Что я хочу сделать просто: Возьмите одно изображение за раз, запишите его в комбинированное изображение, сдвиньте столбцы вправо и так далее. Поскольку они имеют одинаковый размер, это должно быть возможно. Может ли кто-нибудь указать, почему это не работает?

+0

Я нашел виноват. Комбинированный Мат должен быть инициализирован следующим образом: «Mat combinationImagesOfSameSize = new Mat (новый диапазон (0,30), новый диапазон (0,100 * someImagesOfSameSize.size()), CvType.CV_8UC3); Мысль, вставляющая 3, читает 3-канальный png. – kiltek

+0

Вы можете [отправить и принять] (http://meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the-answer-before -заполнение) ваше решение в качестве ответа. Это облегчает вам описание того, что ваша проблема решена. – Aurelius

+0

Я приму ответ в течение 2 дней – kiltek

ответ

3

Изучив OpenCV Java API более подробно я узнал, что, то застройщик Mat(Range rowRange, Range colRange, int type) злоупотребляют мой код, потому что «типа» здесь относится к CvType. Это означает, что я должен указать тип изображения, который будет напоминать Мат. Я установил это значение в «CvType.CV_8UC3», так как мои «someImagesOfSameSize» -изображения были 3-канальными 8-битными png-файлами.

Другое дело, что я изменил это, я использую CopyTo() - метод для записи в подматрицы комбинированного образа, так что код внутри для изменения цикла в:

tempSameSizeImage.copyTo(combinedSameSizeImages.submat(
       new Range(0, 61), new Range(i * 160, (i + 1) * 160)));