Jump to content
Compvision.ru
Sign in to follow this  
trinka

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

Recommended Posts

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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;

}

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

А, ну да :)

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

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

Share this post


Link to post
Share on other sites

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

при использовании 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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×