0

画像から関心領域を手動で選択するためのアプリケーションを作成しています。次の 2 つのウィンドウが表示されます。

  1. ユーザーがマウスで ROI を選択する必要がある OpenCV ウィンドウ。
  2. 選択した ROI の座標が表示される QT ウィンドウ (QListWidget 内)

私の問題は、OpenCV マウス リスナーから QT ウィンドウの QListWidget に書き込む方法です。QListWidget へのポインターを返す QT クラス内に関数を作成する必要があると思いますが、それを行うことができませんでした。誰かが私を正しい方向に向けることができますか?

これが私のメインです:

#include "myclass.h" 
#include <QApplication>
#include </PathToOPENCV/opencv/cv.h>
#include </PathToOPENCV/opencv/highgui.h>
#include <QtDebug>
#include <QListWidget>

using namespace cv;

// Pointer to list widget? Should I use it as a global variable to recieve the pointer of the QListWidget?

QListWidget * ptrToList;

void mouseEvent(int evt, int x, int y, int flags, void* param){

    if( evt == CV_EVENT_LBUTTONUP){
        // WRITE HERE ONTO QListWidget!
        // Something like:
        ptrToList->addItem("blah");
    }

}

int main(int argc, char *argv[])
{

    /*----- OPENCV STUFF ----*/

    String windowName = "selectionWindow";
    namedWindow( windowName , CV_WINDOW_NORMAL);
    Mat theImage = imread("/PATHTOIMAGE/1.jpg");
    imshow( windowName,theImage );

    /* ---- Mouse Listener setup ----- */

    setMouseCallback( windowName, mouseEvent , 0 );

    /* ---- QT Stuff ---- */

    QApplication a(argc, argv);
    myClass w;
    w.show();

    // Should I do something like this?
    ptrToList = w->getListPtr("listWidget");

    return a.exec();
}

ここにmyclass.hがあります

namespace Ui {
class myClass;
}

class myClass : public QMainWindow
{
    Q_OBJECT

public:
    explicit myClass(QWidget *parent = 0);
    ~myClass();

private:
    Ui::myClass *ui;

    QListWidget * getListPtr(QString listName){
        QListWidget * theList;
        // None of these work...
        //theList = this->parent()->getChild( listName );
        //theList = this->getChild( listName );
        return(theList);
    }
};

編集:

@ロク、

私はあなたの提案を試しましたが、間違っていたと思います。マウス コールバックを設定する関数を myclass に追加したので、myclass.h は次のようになります。

#include <functions.cpp>
using namespace cv;

namespace Ui {
class myClass; /* error: forward declaration of 'struct Ui::myClass' */
}

class myClass : public QMainWindow
{
    Q_OBJECT

public:
    explicit myClass(QWidget *parent = 0);
    ~myClass();

    void setInnerMouseCallback(String windowName){ 
        setMouseCallback( windowName, mouseEvent , ui->listWidget ); /* error: invalid use of incomplete type 'struct Ui::myClass'*/
    }

private:
    Ui::myClass *ui;
}

次に、次のコードを含む functions.cpp ファイルを追加しました。

void mouseEvent(int evt, int x, int y, int flags, void* param){
    QListWidget * theList = (QListWidget*) param;
    if( evt == CV_EVENT_LBUTTONUP){

        theList->addItem("blah");
    }
}

これは正しいです?指摘された場所でいくつかのエラーが発生します。ご協力ありがとうございました。

4

1 に答える 1

0

の 3 番目のパラメータはsetMouseCallback()「ユーザー データ」と呼ばれ、そのタイプはvoid*です。この種の情報にのみ使用するように設計されています。setMouseCallback()関数呼び出しをメイン ウィンドウに移動できます。そして、次のように関数を使用できます。

setMouseCallback(windowName, mouseEvent, ui->listWidget);

マウス イベント コールバック関数では、リスト ウィジェットへのポインターを使用します。

void mouseEvent(int evt, int x, int y, int flags, void* param)
{
    if( evt == CV_EVENT_LBUTTONUP)
    {
        QListWidget* listWidget = (QListWidget*)param;
        listWidget->addItem("blah");
    }
}
于 2013-03-29T20:23:01.533 に答える