void Camera::run(){ ... while (capture) { ... // получение изображения через API камеры, генерация QImage image emit frameReady(); }}QImage Camera::getImage(){ QMutexLocker locker(&mutex_image); return image;}
connect(&camera, SIGNAL(frameReady()), this, SLOT(update()));void MainWidget::paintEvent(QPaintEvent *pe){ QPainter painter(this); painter.drawImage(0, 0, camera.getImage()); }
Camera camera;
camera.init(); // в init происходят вызовы методов API камеры, необходимые для запускаcamera.start();
C++ (Qt)Camera *camera = new Camera;camera->moveToThread(camera);// ну а потом init, start и т.д.
public: QImage getImage(); virtual void run();private: QImage image; QMutex mutex_image;signals: void frameReady();
while (capture){// методы из API камеры GrabResult Result; StreamGrabber.RetrieveResult(Result); if (Grabbed == Result.Status()) { mutex_image.lock(); image = QImage::QImage(c_width, c_height, QImage::Format_ARGB32); // здесь происходит преобразование цветового формата, обновленный буфер записывается в image.bits() CPixelFormatConverterBayer converter; SImageFormat inputformat; inputformat.Width = c_width; inputformat.Height = c_height; inputformat.LinePitch = c_width; inputformat.PixelFormat = PixelType_BayerGB8; converter.Init(inputformat); SOutputImageFormat outputformat; outputformat.LinePitch = c_width*BPP; outputformat.PixelFormat = PixelType_RGBA8packed; converter.Convert(image.bits(), c_width*c_height*BPP, (uchar*)Result.Buffer(), c_width*c_height, inputformat, outputformat); emit frameReady(); mutex_image.unlock(); // Reuse the buffer for grabbing the next image StreamGrabber.QueueBuffer(Result.Handle(), NULL); }}QImage Camera::getImage(){ QMutexLocker locker(&mutex_image); return image;}