2012-03-04 2 views
1

я пытаюсь написать функцию масштабирования, которая выглядит примерно так:OpenCV функция масштабирования странные результаты

centre = ((im.width-1)/2, (im.height-1)/2) 
width = int(im.width/(2.0*level)) 
height = int(im.height/(2.0*level)) 
rect = (centre[0]-width, centre[1]-height, width*2, height*2) 
dst = cv.GetSubRect(im, rect) 
cv.Resize(dst, im) 

, когда я использую именно то, что написано выше, я получаю странный результат, в котором нижняя половина результирующей изображение искажено и размыто. Однако, когда я заменить строку cv.Resize(dst, im) с

size = cv.CloneImage(im) 
cv.Resize(dst, size) 
im = size 

он работает отлично. Почему это? есть что-то принципиально неправильное в том, как я выполняю масштабирование?

ответ

3

cv.Resize требует, чтобы источник и место назначения были отдельными ячейками памяти.

Теперь в первом фрагменте кода вы используете cv.GetSubRect для создания объекта, указывающего на область изображения, которую вы хотите увеличить. Здесь новый объект НЕ указывает на новую ячейку памяти. Он указывает на ячейку памяти, которая является подмножеством исходного объекта.

Поскольку cv.Resize требует, чтобы оба расположения памяти были разными, то, что вы получаете, является результатом неопределенного поведения.

Во второй части вашего кода вы выполняете эти критерии, используя cv.CloneImage. вы сначала создаете копию im (то есть размер, однако вы могли бы использовать и пустое изображение), а затем вы используете cv.Resize для изменения размера dst и записи полученного изображения в размере.

Прежде чем использовать их, советую пройти через функцию documentation.

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