• 11757阅读
  • 10回复

QT+工业相机 [复制链接]

上一主题 下一主题
离线jffx
 

只看楼主 倒序阅读 楼主  发表于: 2016-09-08
回复本帖可获得1RMB金钱奖励!
每人最多可获奖1次,奖池剩余3RMB金钱 (中奖几率10%)
— 本帖被 toby520 从 Qt 作品展 移动到本区(2016-09-08) —
各位大虾,本人用QT+工业网口相机播放视频,用相机获取到图像后再QLabel播放,但是很卡顿,因为之前没做过类似的,不知道如何下手,我是用信号槽来传送图像的,参数是一个QImage对象(不知道是否是这个原因导致它很卡顿),,我听别人说用共享内存来做,但是不太清楚大概是怎样的流程。以下是主要的代码片段。

               int width = 659;
                int height =494;

               int w_8=(659*8+31)/32*4; //
      
                 QSize colourImgSize2(660,494);
                QVector<QRgb> grayTable;
                for(int i = 0; i < 256; i++)
                grayTable.push_back(qRgb(i,i,i));
                QImage desImage = QImage(colourImgSize2, QImage::Format_Indexed8);
               uchar*  transData=desImage.bits();

while ( camera.IsGrabbing())
        {
            // Wait for an image and then retrieve it. A timeout of 5000 ms is used.
            camera.RetrieveResult( 5000, ptrGrabResult, TimeoutHandling_ThrowException);
              printf("Grabbing\n");
            // Image grabbed successfully?
            if (ptrGrabResult->GrabSucceeded())
            {
      

              
                unsigned char *colourImgDataPtr = (uint8_t *) ptrGrabResult->GetBuffer();
              //因为图像659*494的,所以转换要转换成4字节的倍数660
                for(int i = 0; i < height; i++)
                {
                   for(int j = 0; j < width; j++)
                   {
                     *transData=*colourImgDataPtr;
                      transData++;
                      colourImgDataPtr++;

                   }
                   transData++;
                   *transData=150;
                }
            

                desImage.setColorTable(grayTable);
               emit log(sMessage,&desImage);//发射函数





#ifdef PYLON_WIN_BUILD
                // Display the grabbed image.
                Pylon::DisplayImage(1, ptrGrabResult);
#endif
            }
            else
            {
                 sMessage="Error: "+QString::number(ptrGrabResult->GetErrorCode(),10);
            

            }
        }
    }
    catch (GenICam::GenericException &e)
    {
    
    }
离线cycloveu

只看该作者 1楼 发表于: 2016-09-08
回帖奖励+ 1
嗯  很好
大道至简 悟在天成
离线liudianwu

只看该作者 2楼 发表于: 2016-09-08
回帖奖励+ 1
请发布到提问区,这里是作品展。建议你用多线程,在线程中update,每秒钟更新超过几十张必须要用多线程,否则卡顿!
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线never_forget

只看该作者 3楼 发表于: 2016-09-08
共享内存 QT 有系统实现,用起来还是挺简单的,把图片存入共享内存,另一端也同时只读访问,应该就是这样的流程,【PS:如果共享内存能加速的话】楼主加油!
离线jffx

只看该作者 4楼 发表于: 2016-09-08
回 liudianwu 的帖子
liudianwu:请发布到提问区,这里是作品展。建议你用多线程,在线程中update,每秒钟更新超过几十张必须要用多线程,否则卡顿! (2016-09-08 10:58) 

不好意思,新人没注意到,,谢谢提醒
离线yanwuyue

只看该作者 5楼 发表于: 2016-09-09
工业相机的帧率一般都很高,我都是隔几帧刷一次,算好频率在30FPS左右,反正对肉眼也没什么区别
离线zhuifengwy

只看该作者 6楼 发表于: 2016-09-12
现在解决如何了,我是要传输到手机端
离线hehui

只看该作者 7楼 发表于: 2016-09-13
卡是QLabel造成的,特别是帧率很高的时候!
不要使用QLabel,虽然用起来简单但效率却很低,用QWidget直接画.
我试过QLabel要占用20%的CPU,换成QWidget却只有2%.
用QOpenGLWidget更好!
离线jffx

只看该作者 8楼 发表于: 2016-09-22
回 zhuifengwy 的帖子
zhuifengwy:现在解决如何了,我是要传输到手机端 (2016-09-12 13:03) 

可以显示了,没有以前那么卡,但是视频有时好像会出现横线,可能就是前几帧的数据造成的影响,,我是在采集到图像加了延时,感觉自己好low额,,现在试一试7楼大虾的建议
离线jffx

只看该作者 9楼 发表于: 2016-11-02
回 zhuifengwy 的帖子
zhuifengwy:现在解决如何了,我是要传输到手机端 (2016-09-12 13:03) 

电脑端可以,但是放在arm出问题了
离线zhuifengwy

只看该作者 10楼 发表于: 2016-11-03
能说说电脑端的实现思路么,arm上卡我估计还是arm性能太低了
快速回复
限100 字节
 
上一个 下一个