2014-02-12 119 views
1

我想用基於mouseClicks的OpenCV對圖像進行操作。QLabel QT中的OpenCV圖像座標

我使用QLabel來顯示cv :: Mat圖像。現在我的問題是獲取相對於圖像的鼠標點擊位置。所以,我想(0,0)在圖像的整個角落。

以下是我的mousePressEvent,但這些不正確的座標。

void MainWindow::mousePressEvent(QMouseEvent* ev) 
{ 


//This seems to work thanks to Pavel 
     QPoint P = ui->label->mapFrom(this, ev->pos()) 



    //if(ui->label->underMouse()) 
    { 
     QMessageBox msgBox; 
     //m 

sgBox.setText(QString("Click Detected X=")+QString::number(mFirstX)+QString(" Y=")+QString::number(mFirstY)); 
      msgBox.setText("x ="+QString::number(P.x()) + " y= " + QString::number(P.y())); 
      msgBox.exec(); 
     } 


    } 

    bool MainWindow::eventFilter(QObject *obj, QEvent *event) 
    { 
     if (event->type() == QEvent::MouseMove) 
     { 


      QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); 
    /////// 
    */// This seem to still give wrong position, these values do not match to those I get when I /// click 
    /////// 
      const QPoint P = ui->label->mapFrom(this, mouseEvent->pos()); 
      //statusBar()->showMessage(QString("Mouse move (%1,%2)").arg(mouseEvent->pos().x()).arg(mo 
useEvent->pos().y())); 
     statusBar()->showMessage(QString("Mouse move (%1,%2)").arg(P.x()).arg(P.y())); 
     } 

     return false; 
    }* 

請幫忙。

+0

你應該提供輸出,你會得到什麼?此外,我會使用QGraphicsScene來達到這個目的,因爲它更容易定義和播放附在場景中的物體(圖像)。 – baci

+1

您需要將'QLabel'的對齊方式設置爲'Qt :: AlignTop | Qt :: AlignLeft'並確保其'scaledContents'屬性爲false。您應該使用'ui-> label-> mapFrom(this,ev-> pos())'將MainWindow的座標轉換爲標籤座標。 –

+0

完美...!非常感謝@PavelStrakhov。 – mkuse

回答

2

您需要將QLabel的對齊方式設置爲Qt::AlignTop | Qt::AlignLeft並確保其scaledContents屬性爲false。您應該使用ui->label->mapFrom(this, ev->pos())將MainWindow座標轉換爲標籤座標。