Qt C++ video4linux 5Mp felbontás

Fórumok

Üdv!

Ez alapján a projekt alapján szépen működik a teszt capture alkalmazás. De csak 640*480 felbontásig. A Capture képet lementem, de az adott 640*480 felbontásúnál feljebb nem engedi.
A kamera tud 5Mp felbontást, ezt hogy tudom kihasználni?

Ha a kódban átírom kisebb felbontásra, akkor az szépen működik (pl. 320*240, 160*120). De pl. az 1024*768-nál már nincs capture kép és kilépésnél: "Warning: driver is sending image at 640x480". A driver csak ennyit tudhat(?).

Igazából azt szeretném megoldani, hogy kisebb (320*240) felbontásnál az elmentett kép 5Mp felbontásban kellene:

...
void MainWindow::onStopCapture()
{
// stop capture
t->devam=false;
//QImage img; save buffer to file
QString savepath = "/path/to/pic1.png";
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
video->img.save(savepath, "PNG");
}
...

Itt a "stop capture" után át kellene váltanom nagyobb felbontásba és azt elmenteni?

--
G.

Hozzászólások

Tudna segíteni valaki, hogy pl. a legnagyobb felbontás hogy kérdezhető le v4l2-ban?

A v4l2-ctl által visszaadott felbontás a legnagyobb? Ez ennyit tud (640*480)?

# v4l2-ctl --all
Driver Info (not using libv4l2):
Driver name : uvcvideo
Card type : WebCam
Bus info : usb-0000:00:1a.0-1.1
Driver version: 3.16.6
Capabilities : 0x84000001
Video Capture
Streaming
Device Capabilities
Device Caps : 0x04000001
Video Capture
Streaming
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
Width/Height : 640/480
Pixel Format : 'YUYV'
Field : None
Bytes per Line: 1280
Size Image : 614400
Colorspace : Unknown (00000000)
Crop Capability Video Capture:
Bounds : Left 0, Top 0, Width 640, Height 480
Default : Left 0, Top 0, Width 640, Height 480
Pixel Aspect: 1/1
Streaming Parameters Video Capture:
Capabilities : timeperframe
Frames per second: 30.000 (30/1)
Read buffers : 0
brightness (int) : min=0 max=255 step=1 default=128 value=128
contrast (int) : min=0 max=255 step=1 default=64 value=64
saturation (int) : min=0 max=63 step=1 default=32 value=32
hue (int) : min=-90 max=90 step=1 default=0 value=0
gamma (int) : min=1 max=10 step=1 default=8 value=8
power_line_frequency (menu) : min=0 max=2 default=1 value=1
sharpness (int) : min=0 max=16 step=1 default=2 value=2
backlight_compensation (int) : min=0 max=1 step=1 default=0 value=0
exposure_auto_priority (bool) : default=0 value=1

--
G.

A QByteArray-QBuffer minek a kódba?

Az simán lehet, hogy a kamera 5 MP-t nem tud csak állóképben, és/vagy linux alatt sehogy se.
(Én utoljára ezzel teszteltem a kamerámat: https://apps.ubuntu.com/cat/applications/saucy/qv4l2/)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Valami ilyesmire gondoltam, hogy a capture megy a nagy felbontásban és video widget-et meg kicsinyíteném (de fixen, nem az egérrel mint a mintában):
http://www.qtcentre.org/wiki/index.php?title=QGraphicsView:_Smooth_Pann…

Kérdés a video widgetet lehet-e méretezni, skálázni. A videowidget egy sima QWidget:
videowidget.h

#ifndef VIDEOWIDGET_H
#define VIDEOWIDGET_H

#include
#include

class videowidget : public QWidget
{
Q_OBJECT
public:
explicit videowidget(QWidget *parent = 0);
QImage img;

protected:
void paintEvent(QPaintEvent *event);

signals:

public slots:

};

#endif // VIDEOWIDGET_H

videowidget.cpp:

#include "videowidget.h"

videowidget::videowidget(QWidget *parent) :
QWidget(parent)
{
setAutoFillBackground(true);
}

void videowidget::paintEvent(QPaintEvent *event) {
try{
QPainter painter(this);

if(!img.isNull()){
painter.drawImage(QPoint(0,0), img);
}
}catch(...){}
}

mainwindow.cpp:

...
// video widget
video=new videowidget();
video->show();
// vbox
vbox=new QVBoxLayout(this);
vbox->addWidget(video);

/*
vbox->addWidget(startCapture);
vbox->addWidget(stopCapture);
vbox->addWidget(exitButton);
*/

setLayout(vbox);

resize(320,240);

// capture thread
t=new CaptureThread(video, 720, 576, "/dev/video1");
...

Valami ilyesmi lesz azt hiszem:

class YourClass:public QWidget
{
...
protected:
void paintEvent ( QPaintEvent * event );
void wheelEvent ( QWheelEvent * event );
private:
qreal scale;
};

void YourClass::paintEvent ( QPaintEvent * event )
{
QPainter p;
p.scale(scale,scale);
// paint here
}
void YourClass::wheelEvent ( QWheelEvent * event )
{
scale+=(event->delta()/120); //or use any other step for zooming
}

--
G.

A v4l2 C library-ja nem tudja az 5Mp-es kamera képét kezelni? (5Mp-es felbontásban)
Vagy ez mitől függ?

--
G.

Van aki mélyebben ért a v4l2-hoz? Ehhez a témához is kapcsolódik a kérdés végülis.
A kisebb felbontás video record esetén érhető el. Nem egészen világos, hogy hogyan érhető el a nagy felbontás (5Mp). C/C++-ban ez (5Mp nagy felbontás) hogyan érhető el állókép készítéséhez?

Nézegetem a forráskódokat:
http://www.twam.info/wp-content/uploads/2009/04/v4l2grab.c
http://www.jayrambhia.com/blog/capture-v4l2/

De nem látom igazából, hogy a nagyfelbontású állóképet hogyan csinálják.

--
G.

en ugy lattam hogy a Qt mindig max felbontasba rakja a kamerat,
ha kisebb kepet kersz akkor atmeretezi software-esen

v4l2-ctl -al tudod nézni hogy milyen felbontásban van a kamera epp, meg hogy mit támogat (--list-formats)

nekem ugy tunik hogy ez a kamera ennyit tud (640x480) nem tobbet

Felbontást lehet állítani, csak egy adott felbontás fölé nem enged már. Tehát a kamera online képe csak annyit tud.
Jelenleg azt csinálom, hogy a kamera preview képe alacsonyabb felbontású és ha kell, akkor a preview képet megállítom és külső prg-vel készítek 5Mp-es képet.

--
G.

ja latom:
(https://svn.code.sf.net/p/qtv4lcapture/code/capturethread.cpp)


CLEAR(fmt);
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 640;
fmt.fmt.pix.height = 480;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB24;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
xioctl(fd, VIDIOC_S_FMT, &fmt);

ez is a v4l2 -t hasznalja
azthittem qt-bol tudtad valahogy