はじめに
以前の投稿(
OpenCVサービスのQt DesignerおよびRuntime Qtライブラリ... )のコメントを分析し
て、OpenCVライブラリのビデオキャプチャデバイスと、ランタイムライブラリとウィジェットを分離する方法について詳しく説明する必要がありました。
Qt Designerでの作業は便利です(私は残念です)。そのため、CvCaptureのインターフェイスデザインコンポーネントが登場しました。 作業の開始後、「科学的」な説明が作成されました。たとえば、ビデオキャプチャデバイスを使用してアプリケーションのプロパティまたはパラメーターのインターフェイスを設計するとき、同様の何かを使用すると便利です。
プロジェクトアーカイブのダウンロード中に読み進めてください。
謝辞。
前の投稿にコメントを残してくれた皆さんに感謝します。
ランタイムライブラリ。
そのため、OpenCVライブラリがインストールされ、コードサンプルがレビューされます。 ビデオキャプチャデバイスをQtに「固定」するときです。 はい、それだけではなく、デバイスを動的に変更して画像を受信するために。 はい、画像、ビデオへのすべての方法を覚えています。 はい、カメラ番号を切り替えます。 はい、そうです...投稿は短くなります。
ライブラリ。
簡単なことは何ですか! QObjectから新しいライブラリクラスを継承し、QScopedPointerコレクションの要素としてプライベートクラスの開発者に不要なフィールドとメソッドを非表示にし、警告信号とプロセッサスロットをマウントします。
ヘッダーファイルcqtopencvcaptureobject.hを取得します#ifndef CQTOPENCVCAPTUREOBJECT_H #define CQTOPENCVCAPTUREOBJECT_H #include "../../../include/qtopencv_global.h" #include <opencv2/opencv.hpp> #include <QObject> #include <QScopedPointer> QT_BEGIN_HEADER QT_BEGIN_NAMESPACE /*----------------------------------------------------------------------------*/ /** \internal \class CQtOpenCVCaptureObjectPrivate \brief CvCapture OpenCV. */ class CQtOpenCVCaptureObjectPrivate; /*----------------------------------------------------------------------------*/ /** \class CQtOpenCVCaptureObject \brief CvCapture OpenCV. */ class #if defined(QTOPENCV_LIB_EXPORT) QTOPENCV_DECLARE_EXPORT #else Q_DECL_EXPORT #endif CQtOpenCVCaptureObject : public QObject { Q_OBJECT Q_CLASSINFO("brief", "OpenCV Capture class.") Q_CLASSINFO("author", "Vladimir N. Litvinenko") Q_CLASSINFO("URL", "http://www.codepaint.ru") Q_CLASSINFO("email", "litvinenko.vladimir@gmail.com") Q_CLASSINFO("created", "21-JUN-2012") Q_CLASSINFO("edited", "06-JUL-2012") public: explicit CQtOpenCVCaptureObject ( QObject *parent = 0 ); virtual ~CQtOpenCVCaptureObject (); CvCapture* getCapture () const; QString getPath () const; int getNumber () const; int getTimeoutInterval () const; IplImage* getImage () const; int getFrameCount () const; bool isInternal () const; bool isExternal () const; bool isActive () const; bool isRecap () const; signals: /** \fn [SIGNAL] void CQtOpenCVCaptureObject::signal_Errno ( int errno, const QString& errmsg ); \brief . \param errno - \param errmsg - */ void signal_Errno ( int, const QString& ); /** \fn [SIGNAL] void CQtOpenCVCaptureObject::signal_CaptureChanged () \brief */ void signal_CaptureChanged (); /** \fn [SIGNAL] void CQtOpenCVCaptureObject::signal_CaptureChanged ( const CvCapture* value ) \brief \param value - CvCapture OpenCV */ void signal_CaptureChanged ( const CvCapture* ); /** \fn [SIGNAL] void CQtOpenCVCaptureObject::signal_ImageChanged ( const IplImage* value ) \brief IplImage OpenCV. \param value - IplImage OpenCV. */ void signal_ImageChanged ( const IplImage* ); /** \fn [SIGNAL] void CQtOpenCVCaptureObject::signal_TimeoutChanged () \brief */ void signal_TimeoutChanged (); /** \fn [SIGNAL] void CQtOpenCVCaptureObject::signal_TimeoutChanged ( int value ) \brief \param value - */ void signal_TimeoutChanged ( int ); /** \fn [SIGNAL] void CQtOpenCVCaptureObject::signal_ActiveChanged ( bool value ) \brief -. \param value - . true , false - -. */ void signal_ActiveChanged ( bool ); public slots: void slot_SetNumber ( int ); void slot_SetPath ( const QString& ); void slot_SetAsInternal ( bool ); void slot_SetTimeout ( int ); void slot_captureOn ( bool ); void slot_Activate (bool); void slot_SetRecap (bool); protected: virtual void timerEvent(QTimerEvent *event); private: Q_DISABLE_COPY(CQtOpenCVCaptureObject) Q_DECLARE_PRIVATE(CQtOpenCVCaptureObject) QScopedPointer<CQtOpenCVCaptureObjectPrivate> d_ptr; }; /*----------------------------------------------------------------------------*/ QT_END_NAMESPACE QT_END_HEADER #endif // CQTOPENCVCAPTUREOBJECT_H
スロット:
- slot_SetNumberは、カメラ番号の設定を担当します
- slot_SetPathは、ビデオキャプチャデバイスの画像ファイル、ビデオ、またはWeb-CGI URLを対象としています
- slot_SetAsInternalは、ビデオキャプチャデバイスがコンピューターのカメラであることを示します(私の意見では、 不要です。 自分で決めてください )
- slot_SetTimeoutは、 CvCaptureからフレームを取得する時間をミリ秒で設定します
- slot_captureOnは 、 CvCaptureを有効/無効にします
- slot_Activateは、フレーム要求タイムアウトモードを有効 /無効にします
- slot_SetRecapは、ビデオキャプチャデバイスに、フレーム(イメージ)を取得する前に再作成する必要があることを伝えます。 カメラへのWebインターフェイスを使用する場合に必要です
.pro
ファイルを配置します
DEFINES += QDESIGNER_EXPORT_WIDGETS
OpenCVライブラリを接続する必要はなくなりました。ランタイムライブラリに応じて接続されます。
そして、ここで、彼女、最愛の人、そして締める:
unix: LIBS += -L/usr/lib -lQtOpenCVCapture INCLUDEPATH += $$PWD/../../runtime/capture/QtOpenCVCapture DEPENDPATH += /usr/lib
注意してください! パスは
/usr/lib
指します。 これは便利です。 将来、このディレクトリにライブラリへのシンボリックリンクを作成するだけで、リンクに問題はありません!
デザイナーのウィジェットプロパティを宣言します。 ... Q_PROPERTY( bool visible READ isVisible WRITE slot_setVisible ) Q_PROPERTY( bool internal READ isInternal WRITE slot_SetAsInternal ) Q_PROPERTY( QString path READ getPath WRITE slot_SetPath ) Q_PROPERTY( int number READ getNumber WRITE slot_SetNumber ) Q_PROPERTY( int numberMax READ getNumberMax WRITE slot_SetNumberMax ) Q_PROPERTY( int timeout READ getTimeoutInterval WRITE slot_SetTimeout ) Q_PROPERTY( int timeoutMax READ getTimeoutMax WRITE slot_SetTimeoutMax ) Q_PROPERTY( int timeoutStep READ getTimeoutStep WRITE slot_SetTimeoutStep ) Q_PROPERTY( bool recapture READ isRecap WRITE slot_SetRecap ) Q_PROPERTY( QString FrameTitle READ getFrameTitle WRITE slot_setFrameTitle ) Q_PROPERTY( QString GroupBoxTitle READ getGroupBoxTitle WRITE slot_setGroupBoxTitle ) Q_PROPERTY( QString RadioNumberTitle READ getRadioNumberTitle WRITE slot_setRadioNumberTitle ) Q_PROPERTY( QString RadioPathTitle READ getRadioPathTitle WRITE slot_setRadioPathTitle ) Q_PROPERTY( QString PathTitle READ getPathTitle WRITE slot_setPathTitle ) Q_PROPERTY( QString NumberTitle READ getNumberTitle WRITE slot_setNumberTitle ) Q_PROPERTY( QString TimeOutTitle READ getTimeOutTitle WRITE slot_setTimeOutTitle ) Q_PROPERTY( QString TimeOutExtTitle READ getTimeOutExtTitle WRITE slot_setTimeOutExtTitle ) Q_PROPERTY( QString RecaptureTitle READ getRecaptureTitle WRITE slot_setRecaptureTitle ) ...
プロパティをサポートするためのスロットとメソッドのセットを拡張します。
...
ランタイムライブラリのテスト例からウィンドウ設定をコピーします。 void CQtOpenCVCaptureWidgetPrivate::setupUi ( QWidget* parent ) { p_Frame = new QFrame(parent); Q_ASSERT(p_Frame); p_Frame->setObjectName(QString::fromUtf8("p_Frame")); p_Frame->resize(550, 195); p_Frame->setMinimumSize(QSize(550, 195));
信号とスロットを接続します。
void CQtOpenCVCaptureWidgetPrivate::setupConnections () {
ウィジェットに基づいてライブラリを収集します。
デザイナへのプラグイン。
QWidgetライブラリをQt Designerに接続します。
コレクションプロジェクトを作成しましょう。
CONFIG += designer plugin debug_and_release TARGET = $$qtLibraryTarget(CQtOpenCVCollection) TEMPLATE = lib DEFINES += QDESIGNER_EXPORT_WIDGETS HEADERS = cqtopencvcapturewidgetplugin.h cqtopencvcollection.h SOURCES = cqtopencvcapturewidgetplugin.cpp cqtopencvcollection.cpp RESOURCES = icons.qrc
プラグインクラスを宣言します。 #ifndef CQTOPENCVCAPTUREWIDGETPLUGIN_H #define CQTOPENCVCAPTUREWIDGETPLUGIN_H #include <QDesignerCustomWidgetInterface> #include <QtDesigner/QDesignerExportWidget> class #if defined(QDESIGNER_EXPORT_WIDGETS) QDESIGNER_WIDGET_EXPORT #else Q_DECL_EXPORT #endif CQtOpenCVCaptureWidgetPlugin : public QObject, public QDesignerCustomWidgetInterface { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: CQtOpenCVCaptureWidgetPlugin(QObject *parent = 0); bool isContainer() const; bool isInitialized() const; QIcon icon() const; QString domXml() const; QString group() const; QString includeFile() const; QString name() const; QString toolTip() const; QString whatsThis() const; QWidget *createWidget(QWidget *parent); void initialize(QDesignerFormEditorInterface *core); private: bool m_initialized; };
コレクションクラスを宣言します。
#ifndef CQTOPENCVCOLLECTION_H #define CQTOPENCVCOLLECTION_H #include <QtDesigner/QtDesigner> #include <QtCore/qplugin.h> class CQtOpenCVCollection : public QObject, public QDesignerCustomWidgetCollectionInterface { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetCollectionInterface) public: explicit CQtOpenCVCollection(QObject *parent = 0); virtual QList<QDesignerCustomWidgetInterface*> customWidgets() const; private: QList<QDesignerCustomWidgetInterface*> m_widgets; }; #endif
実装:
#include "cqtopencvcapturewidgetplugin.h"
に注意してください
CQtOpenCVImageWidgetPlugin
および
CQtOpenCVCannyWidgetPlugin
実装した後
CQtOpenCVCannyWidgetPlugin
コメントを削除できます。 また、Qt DesignerコンポーネントのOpenCVグループには、新しい要素が表示されます。
プロジェクトのアーカイブ。テストケース。
すべてのライブラリをアセンブルし、リンクを正しく割り当て、Qt Designerのプラグインカタログにコレクションリンクをインストールした後、テストケースを作成できます。
デザイナで
MainWindowを作成し、ウィジェットを配置して組み立てます。
おわりに
- もう一度、 プロジェクトのソースコード。
- ComboBoxを追加して、カメラのタイプを選択してください。
- 「できます」と書いてはいけません。 ただやってください。 自由に使えるコード
ご清聴ありがとうございました。