Старая тема, я знаю. Нашел проблему с кем-то, использующим 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.
Код выглядит отлично с одним исключением. Управление памятью. 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
}
При перемещении кода на другую машину у вас не будет проблем с дорогой.
Спасибо большое! Это действительно работает! Но. Почему память, которая испортилась? Первый. У меня есть некоторая загрузка памяти 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 помечена как свободная, и компилятор может поместить другие данные? Я прав?