IplImage * MainWindow::QImage2IplImage(const QImage * image)
{
IplImage * cvImage = cvCreateImageHeader(cvSize(image->width(),
image->height()), IPL_DEPTH_8U, 4);
cvImage->imageData = (char*)image->bits();
IplImage* colorImage = cvCreateImage(cvGetSize(cvImage), 8, 3);
cvConvertImage(cvImage, colorImage, 0);
return colorImage;
}
понедельник, 25 июня 2012 г.
OpenCV создание avi файла из набора кадров
#include <opencv2/opencv.hpp>void MainWindow::test()
{
double fps = 5.;
CvSize size = cvSize(219, 187);//Размер картинки
CvVideoWriter *writer = cvCreateVideoWriter( // Создаём файл для записи
"out.avi",
//CV_FOURCC('M','J','P','G'),
//CV_FOURCC('X','V','I','D'),
//CV_FOURCC('D','I','V','X'),
CV_FOURCC('F','L','V','1'),
fps,
size
);
IplImage* img = cvLoadImage("Image0.jpg");
const int frameCount = 100;
int c = 0;
while (c++, c != frameCount)
{
cvWriteFrame(writer, img ); // Записываем
}
cvReleaseVideoWriter( &writer ); // Освобождаем ресурсы
cvReleaseImage( &img );
}
OpenCV подключение в проект Qt
Скачиваем OpenCV OpenCV-2.4.1.exe
Распаковываем
Правим pro файл
# OpenCV
OPENCV = D:/opencv
OPENCV_LIB = $$OPENCV/build/x86/vc9/lib
INCLUDEPATH += $$OPENCV/build/include/opencv $$OPENCV/build/include
QMAKE_LIBDIR += $$OPENCV_LIB
CONFIG(debug, debug|release) {
LIBS += $$files($$OPENCV_LIB/*241d.lib)
} else {
LIBS += $$files($$OPENCV_LIB/*241.lib)
}
Распаковываем
Правим pro файл
# OpenCV
OPENCV = D:/opencv
OPENCV_LIB = $$OPENCV/build/x86/vc9/lib
INCLUDEPATH += $$OPENCV/build/include/opencv $$OPENCV/build/include
QMAKE_LIBDIR += $$OPENCV_LIB
CONFIG(debug, debug|release) {
LIBS += $$files($$OPENCV_LIB/*241d.lib)
} else {
LIBS += $$files($$OPENCV_LIB/*241.lib)
}
понедельник, 21 мая 2012 г.
Добавление цели для make clean
В pro файл добавляем
QMAKE_CLEAN += filename
Это нужно чтобы make по команде make clean знал какие файлы удалить. Например, бинарник.
QMAKE_CLEAN += filename
Это нужно чтобы make по команде make clean знал какие файлы удалить. Например, бинарник.
пятница, 23 марта 2012 г.
Precompiled Headers в Qt
"Предварительно скомпилированные заголовки - средство повышения производительности, поддерживаемое некоторыми компиляторами при компиляции стабильного тела кода и сохранении состояния скомпилированного кода в бинарном файле. Во время последующих компиляций компилятор будет загружать сохраненное состояние и продолжать компиляцию указанного файла. Каждая последующая компиляция проходит быстрее, поскольку не нужно перекомпилировать стабильный код."Предварительно скомпилированный заголовок должен содержать код, который является стабильным и статичным во всем вашем проекте.
(c) Qt Doc
В Qt к таким частям относятся инклуды Qt-классов.
Кроме повышения производительности, подключение Precompiled Headers позволяет не писать инклуды Qt классов в коде.
Что для этого нужно.
1) Все инклуды Qt клаcов выносятся в отдельный файл.
2) Редактируется файл проекта.
3) В коде больше не нужно включать Qt классы.
среда, 14 марта 2012 г.
Qt Widget просмотра PDF файлов
Я уже писал о том как читать и писать файлы в pdf с помощью библиотеки podofo. Осталось научиться их отображать. Начал анализировать вопрос и попался топик на сайте prog.org.ru.
Приведу это решение здесь.
Приведу это решение здесь.
вторник, 13 марта 2012 г.
Воспроизведение звука в Qt
Qt предоставляет три пути для воспроизведения звука.
Вторым методом является класс QAudioOutput.
- Класс QSound
- Класс QAudioOutput
- Модуль QtPhonon
Note that QSound does not support resources. This might be fixed in a future Qt version.Поэтому, если захочется хранить ваши звуки в ресурсах, ничего не получится. Выход, конечно, есть - написать костыли. А именно - скидывать файл из ресурсов во временную папку и воспроизводить уже оттуда.
Вторым методом является класс QAudioOutput.
понедельник, 12 марта 2012 г.
Эффективный способ самоудаления
Как exe-шнику удалить самого себя? Есть много способов. Самый эффективный и надежный как оказалось - это связка cmd файла и WScript-скрипта. Начиная с Windows XP можно выполнять WScript-скрипты. Этим и воспользуемся.
Кстати, для чего это может понадобиться? Например, если вы пишете свой Uninstall, то вам потом нужно будет почистить и за собой.
Приступим.
Кстати, для чего это может понадобиться? Например, если вы пишете свой Uninstall, то вам потом нужно будет почистить и за собой.
Приступим.
пятница, 30 сентября 2011 г.
Вставка QWidget в QTableWidget
Надо бы рассказать о способе вставки QWidget в QTableWidget.
Вообще, я не очень люблю QTableWidget, т.к. больше привык к QTableView и QAbstractItemModel, QStyledItemDelegate. Но в случае если быстро нужна таблица, связанная с одной готовой моделью, то можно воспользоваться QTableWidget. В принципе, QTableWidget порожден от QTableView и умеет всё то, что умеет и QTableView.
Перейдем к делу. Точнее к постановке задачи.
Надо вставить в ячейки QTableWidget виджеты. Пример на картинке.
То есть, виджеты всегда на виду, а не скрываются, как это делается в случае с делегатом.
В первом столбце банальный QLineEdit, во втором - пользовательский виджет для ввода даты.
Как это сделать?
В коде я приведу работу с QTreeWidget, а не с QTableWidget, но разницы особой нет.
Вообще, я не очень люблю QTableWidget, т.к. больше привык к QTableView и QAbstractItemModel, QStyledItemDelegate. Но в случае если быстро нужна таблица, связанная с одной готовой моделью, то можно воспользоваться QTableWidget. В принципе, QTableWidget порожден от QTableView и умеет всё то, что умеет и QTableView.
Перейдем к делу. Точнее к постановке задачи.
Надо вставить в ячейки QTableWidget виджеты. Пример на картинке.
То есть, виджеты всегда на виду, а не скрываются, как это делается в случае с делегатом.
В первом столбце банальный QLineEdit, во втором - пользовательский виджет для ввода даты.
Как это сделать?
В коде я приведу работу с QTreeWidget, а не с QTableWidget, но разницы особой нет.
пятница, 17 июня 2011 г.
Добавление своего типа в QVariant
Хороший тип QVariant. Это может быть int, double, QDate, QMap, и еще полсотни типов.
Добавим к этим типам собственный класс или структуру, чтобы с ней можно было бы общаться как с другими типами - помещать и извлекать из QVariant.
class SomeClass
{
//всё что нужно
};
Q_DECLARE_METATYPE(SomeClass)
Итак, достаточно после определения класса вызвать макрос Q_DECLARE_METATYPE()
Что это дает?
Добавим к этим типам собственный класс или структуру, чтобы с ней можно было бы общаться как с другими типами - помещать и извлекать из QVariant.
class SomeClass
{
//всё что нужно
};
Q_DECLARE_METATYPE(SomeClass)
Итак, достаточно после определения класса вызвать макрос Q_DECLARE_METATYPE()
Что это дает?
Подписаться на:
Сообщения (Atom)
