00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "qopencamwidget.h"
00024
00025
00026
00027
00028
00060 QOpenCamWidget::QOpenCamWidget(QWidget *parent)
00061 : QWidget(parent)
00062 {
00063
00064 nextFrame = NULL;
00065
00066 frametimer = NULL;
00067
00068 layout = new QVBoxLayout(this);
00069
00070
00071 canvas = new QLabel(this);
00072 canvas->setMinimumSize(200, 100);
00073 canvas->setAlignment(Qt::AlignCenter);
00074
00075
00076 trigger = new QPushButton(this);
00077 trigger->setText("Take picture");
00078 trigger->setEnabled(false);
00079 trigger->hide();
00080
00081
00082 trigger_active = false;
00083
00084 layout->addWidget(canvas);
00085 this->setLayout(layout);
00086 }
00087
00088 QOpenCamWidget::~QOpenCamWidget(void)
00089 {
00090 cvReleaseCapture( &capture );
00091 delete canvas;
00092 delete trigger;
00093 }
00094
00095
00096
00097
00109 void
00110 QOpenCamWidget::setSnapshotVisible(bool visible)
00111 {
00112
00113
00114 if ( visible && !trigger_active )
00115 {
00116 connect( trigger, SIGNAL(clicked()), this, SLOT(startSnap()));
00117 layout->addWidget(trigger);
00118 trigger->show();
00119 trigger_active = true;
00120 }
00121 if ( !visible && trigger_active )
00122 {
00123 layout->removeWidget(trigger);
00124 disconnect( trigger, SIGNAL(clicked()), 0, 0 );
00125 trigger->hide();
00126 trigger_active = false;
00127 }
00128 }
00143 void
00144 QOpenCamWidget::paintEvent ( QPaintEvent * event )
00145 {
00146 QPainter * paint = new QPainter;
00147 paint->begin(this);
00148
00149 if ( nextFrame )
00150 {
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 canvas->setPixmap( QPixmap::fromImage(*nextFrame) );
00161 }
00162 else
00163 {
00164 canvas->setText("No data, check/test camera");
00165 }
00166 paint->end();
00167 }
00168
00169
00182 bool
00183 QOpenCamWidget::grabCapture(int source)
00184 {
00185 capture = cvCaptureFromCAM(0);
00186 if (!capture)
00187 {
00188 qDebug() << "QOpenCamWidget::grabCapture(" << source << ") failed";
00189 return false;
00190 }
00191 cvGrabFrame(capture);
00192 IplImage *image = cvRetrieveFrame(capture);
00193 QSize t_size = QSize(image->width,image->height);
00194
00195 qDebug() << "Device image format: " << image->width << "x" << image->height;
00196 canvas->setMinimumSize(t_size);
00197 canvas->setMaximumSize(t_size);
00198
00199 return true;
00200 }
00201
00216 void
00217 QOpenCamWidget::startCapture(void)
00218 {
00219 frametimer = new QTimer(this);
00220 frametimer->start(70);
00221 connect(frametimer,SIGNAL(timeout()), this,SLOT(grabFrame()));
00222 trigger->setEnabled(true);
00223 }
00224
00240 QImage*
00241 QOpenCamWidget::Ipl2QImage(const IplImage *img)
00242 {
00243 IplImage *tmp=cvCloneImage(img);
00244 cvConvertImage(img,tmp, CV_CVTIMG_SWAP_RB );
00245 QImage * qimage = new QImage(reinterpret_cast<uchar*>(tmp->imageData),
00246 tmp->width,
00247 tmp->height,
00248 3* tmp->width,
00249 QImage::Format_RGB888);
00250 return qimage;
00251
00252 }
00253
00254
00255
00256
00266 void QOpenCamWidget::grabFrame(void)
00267 {
00268 if ( !capture )
00269 {
00270 qDebug() << "Capture device not ready!";
00271 return;
00272 }
00273
00274 cvGrabFrame(capture);
00275
00276 IplImage *iplimage = cvRetrieveFrame(capture);
00277
00278 if (iplimage)
00279 {
00280 nextFrame = Ipl2QImage(iplimage);
00281 }
00282 else
00283 {
00284 nextFrame = NULL;
00285 }
00286 update();
00287 }
00288
00306 void QOpenCamWidget::startSnap(void)
00307 {
00308 if ( frametimer ) {
00309 if (frametimer->isActive())
00310 {
00311 frametimer->stop();
00312 qDebug() << "SNAP!";
00313
00314 emit imageReady(QImage(*nextFrame));
00315 frametimer->start();
00316 }
00317 }
00318 }
00319