QT框架可视化

时间:2017-03-14 12:25:12

标签: c++ qt opencv

目前开始使用qt并在我的代码中发现了一些错误,我无法理解它的来源。也许你会看到并解释它为什么会发生。

这是main.cpp代码部分,它将快门从3000更改为最大值:

if (camera.test_cam->liveFrameReady())
        {
            camera.visualizeFrame(camera.test_cam->liveFrame());
            camera.set_shutter(0, 1, 3000 + i * 200);
            controlWidget->update(camera.test_cam->liveFrame());
            i++;
        } 

代码工作缓慢(1 fps),因为camera.visuzlizeFrame()方法:

void OsCam::visualizeFrame(Common::FrameHandle hFrame)
{
    void* buffer_ptr = this->getFrameData(hFrame);
    int width = hFrame->dataType()->width();
    int height = hFrame->dataType()->height();
    cv::Mat m(height, width, CV_8UC3, (int*)buffer_ptr);
    cv::imshow("test image", m);
    cv::waitKey(1);
}

Gui界面实时显示相机框架,从背景中的visualizeFrame测试图像

在动作上,我不需要调用这个方法(我只是为了确保我能读取内存而使用opencv,因为我对它更熟悉)。

但是,如果我摆脱这个camera.visuzlizeFrame()我的gui变白,并没有给出任何回应。 即使我使用cv :: waitKey或Sleep函数,gui也没有任何反应。

void ControlWidget::update(Common::FrameHandle hFrame)
{
    try
    {
        QImage img((uchar*)hFrame->buffer()->data(), hFrame->dataType()->width(), hFrame->dataType()->height(), QImage::Format::Format_RGB888);
        QSize standart_size = QSize(hFrame->dataType()->width() / 3, hFrame->dataType()->height() / 3);
        QPixmap rectPxmp = QPixmap::fromImage(img).scaled(standart_size);
        this->camera_1->setPixmap(rectPxmp);
        this->camera_2->setPixmap(rectPxmp);
        cv::waitKey(300);
    }

    catch (GeneralException& e)
    {
        std::cout << e.what() << std::endl;
    }
}

我要去QThreads吗?一个用于读取缓冲区的线程和另一个用于gui可视化的线程? 谢谢!

一些额外的代码:

void* OsCam::getFrameData(Common::FrameHandle hFrame)
{
    bool displayFrameData = false;
    void* pFrameData = NULL;
    try
    {
        if (hFrame)
        {
            if (displayFrameData)
            {
                // display information about the frame
                cout << "Frame index: " << hFrame->frameIndex();
                cout << "Frame timestamp: " << hFrame->timestamp();
                // display information about the frame "data type"
                DataTypeHandle hDataType = hFrame->dataType();
                cout << "Frame size in bytes: " << hDataType->frameSizeInBytes() << endl;
                cout << "Width in pixels: " << DataType::width(hDataType) << endl;
                cout << "Height in rows: " << DataType::height(hDataType) << endl;
                cout << "Bit depth: " << DataType::bitDepth(hDataType) << endl;
                cout << "Bytes/line (stride): " << DataType::stride(hDataType) << endl;
                // display the frame video format
                VideoDataType::Format videoFormat = VideoDataType::format(hDataType);
                cout << "Video format: " << VideoDataType::formatString(videoFormat).c_str() << endl;
                // get a pointer to the frame data
            }
            pFrameData = hFrame->buffer()->data();
        }
    }
    catch (GeneralException& e)
    {
        cout << e.what() << endl;
    }
    return pFrameData;
}

和main(我稍微改了一下):

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    ControlWidget *controlWidget = new ControlWidget;
    //controlWidget->show();

    try
    {

        OsCam camera;
        int i = 0;

        for (int j = 0; j<10000 ; j++)
        {
            if ((camera.test_cam->liveFrameReady()))
            {
                Common::FrameHandle loaded = camera.test_cam->liveFrame()->clone();
                camera.visualizeFrame(loaded);
                controlWidget->update(loaded);
                camera.set_shutter(0, 1, 3000 + i * 200);
                loaded->~Frame();
            }
            i++;
        }


    }
    catch (GeneralException& e)
    {
        std::cout << e.what() << std::endl;
        int a;
        std::cin >> a;
        return 1;
    }
} 

在cv :: named_window

之后

0 个答案:

没有答案