Qt Creator C++ (RPi) camera videowidget-re rajzolás

 ( makgab | 2014. október 12., vasárnap - 12:51 )

Üdv!

QT-Creator-t tesztelgetem (RPi-hez). Ebböl az app-ból indultam ki: qtv4lCapture

Merrefele keresgéljek, ha a kamera capture képére szeretnék rajzolni? Pl. egy vonalat v. kört, ami maradjon ott amíg fut a video capture. Valami layer-t kell rátenni az alkalmazás formjára és arra rajzolni?

--
G.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Ez kellene, ha jól sejtem: http://qt-project.org/doc/qt-4.8/qgraphicsscene.html

Legalábbis innen kellene indulnom.

--
G.

A neten néztem, hogy a QFrame-el lehet vonalat rajzolni és az említett projektbe meg is próbáltam ez alapján:

MainWindow::MainWindow(QWidget *parent)
{
exitButton=new QPushButton("Exit",this);
startCapture=new QPushButton("Start Capture",this);
stopCapture=new QPushButton("Stop Capture",this);

connect(exitButton, SIGNAL(clicked()), this, SLOT(on_exit_clicked()));
connect(startCapture, SIGNAL(clicked()), this, SLOT(onStartCapture()));
connect(stopCapture, SIGNAL(clicked()), this, SLOT(onStopCapture()));

video=new videowidget();
video->show();

vbox=new QVBoxLayout(this);
vbox->addWidget(video);
vbox->addWidget(startCapture);
vbox->addWidget(stopCapture);
vbox->addWidget(exitButton);

setLayout(vbox);

resize(1024,768);

t=new CaptureThread(video);

// *******************************
// Add a Line to the video QWidget
QWidget *centralWidget = new QWidget(video);
QGridLayout *layout = new QGridLayout();
centralWidget->setLayout(layout);

QFrame* Line = new QFrame();
Line->setFrameStyle(QFrame::VLine);
//Line->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

QFrame* Line2 = new QFrame();
Line2->setFrameStyle(QFrame::HLine);
//Line2->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

layout->addWidget(Line,10,10,1,1);
layout->addWidget(Line2,20,20,2,2);
// ***************************************
}

De valahogy nem sikerül pozícionálni a két vonalat. Egyszerűen csak egymást keresztező vonalakat szeretnék.
Az addWidget()-ben nem egészen világos, hogy 'Line' esetén mit adok meg.

Vagy másképp kellene a vonalat a video widget-re tenni?

--
G.

Qt 5?

Van a QCamera class http://qt-project.org/doc/qt-5/qcamera.html ami elvileg supportálja a V4L2 eszközöket Linux alatt.

Ha a grabbing megy akkor a következő példában megtalálod, hogyan rajzold ezt ki egy QGraphicsView-re:
http://qt-project.org/doc/qt-5/qtmultimediawidgets-videographicsitem-example.html

Arra tudsz tetszőlegesen rajzolni QGraphicsItemeken keresztül.

Qt4.

A VideoCapture megy, a QFrame-el is rajzol vonalat, csak nem tudom miért pont oda teszi ahova teszi. :)
Az említett példát megnézem mégegyszer, mert egyszer már néztem, de probléma volt vele asszem a qt5 miatt.

--
G.

Mi a konkrét célod? Amit írtál examplet a második postodban ott widgeteket pakolsz egymás mellé közéjük meg egy vonalat. Az azt körülvevő widgetek sizepolicy-e fogja meghatározni hova fog kerülni a layouton belül. Ha tényleg ilyen 2D rajzolgatás (célkereszt a videóra/vízjel/whatever) a célod arra a QGraphicsView való. Ja és kiengedném a grammar nácit: magamból a Qt-t kis t-vel írjuk ;).

Köszönöm a kiigazítást! :)

Igen látom én is most már. Szóval teszt jelleggel egy a QGraphicView kellene vonalakkal (pl. célkereszt).

--
G.

Ezzel próbálkozom:

# mainwindow.h
private:
QGraphicsScene *scene;
QGraphicsView *view;
QGraphicsLineItem *line;

# mainwindow.cpp
...
MainWindow::MainWindow(QWidget *parent)
{
exitButton=new QPushButton("Exit",this);
startCapture=new QPushButton("Start Capture",this);
stopCapture=new QPushButton("Stop Capture",this);

connect(exitButton, SIGNAL(clicked()), this, SLOT(on_exit_clicked()));
connect(startCapture, SIGNAL(clicked()), this, SLOT(onStartCapture()));
connect(stopCapture, SIGNAL(clicked()), this, SLOT(onStopCapture()));

video=new videowidget();
video->show();

vbox=new QVBoxLayout(this);
vbox->addWidget(video);
vbox->addWidget(startCapture);
vbox->addWidget(stopCapture);
vbox->addWidget(exitButton);

setLayout(vbox);

resize(1024,768);

t=new CaptureThread(video);

// *******************************
// Add a Line to the video QWidget
scene = new QGraphicsScene(this);
view = new QGraphicsView(scene);
view->setBackgroundBrush(Qt::transparent);
//view->setBackgroundBrush(Qt::blue);
line = scene->addLine( 10, 10, 200, 200 );
view->show();
// *******************************
}

Lefordul, de nem rajzol semmit. Jó irányba megyek egyáltalán?

--
G.

Na most működik:

// *******************************
// Add a Line to the video QWidget
scene = new QGraphicsScene(this);
view = new QGraphicsView(this);
view->setScene(scene);
view->setStyleSheet("background: transparent; border: transparent;");
QPen bluePen;
bluePen.setColor(Qt::blue);
line = scene->addLine( 20, 20, 20, 30, bluePen );
line2 = scene->addLine( 10, 10, 5, 20, bluePen );
//view->show();
// *******************************

Már csak az nem világos, hogy a 0,0 koordináta miért pont ott van ahol van. :o

A view közepe a 0,0 pont. De akkor csak nekem furcsa...

--
G.