Перейти к содержимому
Compvision.ru
trinka

Создание Bitmap из Mat

Recommended Posts

предлагаю закрепить тему.

как правильно копировать часть изображения? использую Mat. я использую rowRange, colRange, но есть проблема: картинки, полученные таким образом, не всегда хотят отображаться (вывожу на форму clr.net). то есть часть картинок показывается, часть нет (исключение при вызове конструктора Bitmap). пробовал operator() (Rect) - та же фигня. может неправильно так копировать? не забываю перед выводом делать копию картинки(в любом случае это не должно влиять)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

По поводу закрепить - в этом подфоруме все вопросы по OpenCV, не переносить-же их всех в эту тему.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А код, в котором возникает проблема, можно посмотреть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

imageToHomography = imageToHomography.rowRange(fitoffset.y, fitoffset.y+fitoffset.height-1);

imageToHomography = imageToHomography.colRange(fitoffset.x, fitoffset.x+fitoffset.width-1);//если убрать эти 2 строки, все работает

//параметры корректные

this->VidArea->Height = image->rows;//VidArea это pictureBox

this->VidArea->Width = image->cols;

try

{

Bitmap^ b = gcnew Bitmap(image->cols, image->rows, image->step,

PixelFormat::Format24bppRgb, IntPtr(image->data));//здесь бывает исключение

this->VidArea->Image = b;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А сообщение перерисовки отправляете?

Вот тут аналогичные манипуляции проводятся:

http://www.compvision.ru/forum/index.php?showtopic=110

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

при чем тут перерисовка то? bitmap не создается, до перерисовки еще далеко)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А, ну да :)

Ну тогда скорее всего выравнивание не учитываете. Поэтому при размерах кратных 8 все нормально, а иначе все портится.

PS: Тему переименовал и переместил, т.к. понял о чем речь пойдет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

кажется я нашел в чем проблема. эх оупнсиви какой-то глючный, во всяком случае нелогичный :(

при использовании rowRange возвращаемый рез-т картинка - просто указатель на подматрицу исходной картинки. об этом сказано в справке. ну ок.

при этом матрица становится "непоследовательной". т.е. ф-ия isContinuous() возвращает 0. вот тут то и глючит вывод на форму. для bitmap нужно посл-ную картинку.

даже после копирования картинки вот так

imageToHomography = imageToHomography.rowRange(fitoffset.y, fitoffset.y+fitoffset.height-1);

imageToHomography непоследовательный. (хотя выглядит как нормальное копирование).

решается примерно так

imageToHomography = localimage.rowRange(fitoffset.y, fitoffset.y+fitoffset.height-1).clone();

сейчас вроде бы не глючит. надеюсь я и правда нашел этот баг, а не то даже не знаю как это еще можно лечить))

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это вроде бы только ROI если на старый манер. То есть указатели, на картинку-предок, потому и не isContinuous. Копирования самих данных нет, копируется только заголовок, а счетчик ссылок на область памяти картинки-родителя увеличивается. Когда матрицы удаляете, счетчик уменьшается, как только становится равным нулю - память освобождается.

А вот clone специально и сделано, чтобы всю матрицу, которая состоит из заголовка и куска памяти скопировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×