trinka 1 Жалоба Опубликовано April 7, 2012 предлагаю закрепить тему. как правильно копировать часть изображения? использую Mat. я использую rowRange, colRange, но есть проблема: картинки, полученные таким образом, не всегда хотят отображаться (вывожу на форму clr.net). то есть часть картинок показывается, часть нет (исключение при вызове конструктора Bitmap). пробовал operator() (Rect) - та же фигня. может неправильно так копировать? не забываю перед выводом делать копию картинки(в любом случае это не должно влиять) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 7, 2012 По поводу закрепить - в этом подфоруме все вопросы по OpenCV, не переносить-же их всех в эту тему. По поводу копирования - когда выбираем кусок на матрицы при вышеуказанным способом, то, насколько я помню, память с данными не копируется, то есть мы получаем просто указатель, если это учитывать, то все работает правильно. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
trinka 1 Жалоба Опубликовано April 7, 2012 нет, я копирую, я написал, проблема не в этом. когда данные передаются в конструктор битмапа, он уже сам копирует, так что даже не знаю где может быть проблема Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 7, 2012 А код, в котором возникает проблема, можно посмотреть? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
trinka 1 Жалоба Опубликовано April 7, 2012 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; } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 7, 2012 А сообщение перерисовки отправляете? Вот тут аналогичные манипуляции проводятся: http://www.compvision.ru/forum/index.php?showtopic=110 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
trinka 1 Жалоба Опубликовано April 7, 2012 при чем тут перерисовка то? bitmap не создается, до перерисовки еще далеко) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 7, 2012 А, ну да Ну тогда скорее всего выравнивание не учитываете. Поэтому при размерах кратных 8 все нормально, а иначе все портится. PS: Тему переименовал и переместил, т.к. понял о чем речь пойдет. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
trinka 1 Жалоба Опубликовано April 8, 2012 а что, выравнивать еще надо? сегодня попробую. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
trinka 1 Жалоба Опубликовано April 8, 2012 кажется я нашел в чем проблема. эх оупнсиви какой-то глючный, во всяком случае нелогичный при использовании 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(); сейчас вроде бы не глючит. надеюсь я и правда нашел этот баг, а не то даже не знаю как это еще можно лечить)) 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 8, 2012 Это вроде бы только ROI если на старый манер. То есть указатели, на картинку-предок, потому и не isContinuous. Копирования самих данных нет, копируется только заголовок, а счетчик ссылок на область памяти картинки-родителя увеличивается. Когда матрицы удаляете, счетчик уменьшается, как только становится равным нулю - память освобождается. А вот clone специально и сделано, чтобы всю матрицу, которая состоит из заголовка и куска памяти скопировать. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах