2014-02-12 21 views
1

나는 mouseClicks를 기반으로 OpenCV로 이미지를 조작하고 싶습니다.QLabel OpenCV Image 좌표 Qt에서

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인지 확인하십시오. MainWindow 좌표를 레이블 좌표로 변환하려면'ui-> label-> mapFrom (this, ev-> pos())'를 사용해야한다. –

+0

완벽한 ...! 고마워요 @Pavelstrakhov. – mkuse

답변

2

QLabel의 정렬을 Qt::AlignTop | Qt::AlignLeft으로 설정하고 scaledContents 속성이 false인지 확인해야합니다. MainWindow 좌표를 레이블 좌표로 변환하려면 ui->label->mapFrom(this, ev->pos())을 사용해야합니다.