Отображение изображения opencv Mat в QGraphicsView [дубликат]

Старая тема, я знаю. Нашел проблему с кем-то, использующим PDO, и ответ заключался в том, чтобы использовать это для строки подключения PDO:

$pdo = new PDO(
    'mysql:host=mysql.example.com;dbname=example_db',
    "username",
    "password",
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

Сайт, на котором я взял это, отключен, смог получить его с помощью кеша google.

14
задан user1113159 16 June 2013 в 20:11
поделиться

2 ответа

Код выглядит отлично с одним исключением. Управление памятью. cv::Mat не работает как QImage в этом мастере. Помните, что QImage использует копию для механизма записи и разделяет память для каждой копии. cv::Mat также разделяет память, но не копирует на запись (я тоже новичок в open cv (2 недели), поэтому не могу объяснить, как именно это работает, но я наткнулся на некоторые раздавки из-за этого )! Другое дело, что когда вы создаете QImage из образа памяти, используется эта память и не принимает на себя ответственность за нее. Конечным результатом является то, что в Linux и Qt5 ваш код выходит из строя из-за проблем с управлением памятью.

Итак, я исправил ваши функции преобразования, которые он отлично работает:

QImage Mat2QImage(cv::Mat const& src)
{
     cv::Mat temp; // make the same cv::Mat
     cvtColor(src, temp,CV_BGR2RGB); // cvtColor Makes a copt, that what i need
     QImage dest((const uchar *) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
     dest.bits(); // enforce deep copy, see documentation 
     // of QImage::QImage ( const uchar * data, int width, int height, Format format )
     return dest;
}

cv::Mat QImage2Mat(QImage const& src)
{
     cv::Mat tmp(src.height(),src.width(),CV_8UC3,(uchar*)src.bits(),src.bytesPerLine());
     cv::Mat result; // deep copy just in case (my lack of knowledge with open cv)
     cvtColor(tmp, result,CV_BGR2RGB);
     return result;
}

Итак, мы оба должны сделать чтение об управлении памятью в open-CV:).

OFFTOPIC: Лучший способ включить openCV в qt-проекты в Linux - это добавить к pro-файлу что-то вроде :

# add open CV
unix {
    CONFIG += link_pkgconfig
    PKGCONFIG += opencv
}

При перемещении кода на другую машину у вас не будет проблем с дорогой.

31
ответ дан Marek R 26 August 2018 в 19:48
поделиться

Спасибо большое! Это действительно работает! Но. Почему память, которая испортилась? Первый. У меня есть некоторая загрузка памяти incv :: Mat

cv::Mat mat1 = cv::imread("bugero.jpg",3);

mat1 - [=====================================]

, затем я поместил копию этого cvMat в другой cv: Mat

cv::Mat temp(src.cols,src.rows,src.type());
cvtColor(src, temp,CV_BGR2RGB);

mat1  -  [=========================================]

temp  -  [=========================================]

, затем сделаю QImage из этих данных QImage dest = QImage ((uchar *) temp.data, temp.cols, temp.rows, temp.step, QImage :: Format_RGB888);

mat1  -   [============================================]

temp  - > [============================================]
         /
dest --/

И затем temp выходит за пределы области и удаляет ее самостоятельно ? QImage не принимает на себя ответственность за это, поэтому память в temp1 и dest помечена как свободная, и компилятор может поместить другие данные? Я прав?

2
ответ дан user1113159 26 August 2018 в 19:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: