Qt C++由于海康摄像头有帧图像宽高颠倒现象而引起的系统崩溃的原因

导致LINUX版车辆视频检测器崩溃的原因:由于使用VPU取帧,帧图像有个高度不正常的现象,在代码 中有裁剪帧图像的操作,由于其中两个摄像头的宽、高颠倒了,比如:宽352 高288,结果成了宽288,高352了,在kernel->dataitem_image.cpp->lzf_saveImage()的部分代码中有裁剪帧图像的代码 ,由于裁剪尺寸超过帧图像的宽度,故引起了崩溃现象。改正确的代码如下,这样就可以容错了。

 qDebug()<<"curframe is not null";
        //此处代码主要解决VPU硬解码得到的图像的高度不正确的问题,强制修改为标准尺寸,裁掉多余的部分
        
        //下面分别对不同尺寸的视频的宽和高都做了判断,原因是有些地方的摄像头的宽和高是反着的,比如:宽:352 高:288,
        //但是有些摄像头却是反着的,所以要进行判断,否则,就会引起系统崩溃,因为裁剪的宽度超过实际帧的宽度就会引起崩溃
        Mat tempimg;
        if(curframe.size().width==1920){
            cv::Rect rect(0, 0, 1920,1080);
            curframe(rect).copyTo(tempimg);
        }else if(curframe.size().width==1080){
            cv::Rect rect(0, 0, 1080,1920);
            curframe(rect).copyTo(tempimg);
        }
        else if(curframe.size().width==1280){
            cv::Rect rect(0, 0, 1280,720);
            curframe(rect).copyTo(tempimg);
        }else if(curframe.size().width==720){
            cv::Rect rect(0, 0, 720,1280);
            curframe(rect).copyTo(tempimg);
        }else if(curframe.size().width==704){
            cv::Rect rect(0, 0, 704,576);
            curframe(rect).copyTo(tempimg);
        }else if(curframe.size().width==576){
            cv::Rect rect(0, 0, 576,704);
            curframe(rect).copyTo(tempimg);
        }else if(curframe.size().width==640){
            cv::Rect rect(0, 0, 640,480);
            curframe(rect).copyTo(tempimg);
        }else if(curframe.size().width==480){
            cv::Rect rect(0, 0, 480,640);
            curframe(rect).copyTo(tempimg);
        }else if(curframe.size().width==288){
            cv::Rect rect(0, 0, 288,352);
            curframe(rect).copyTo(tempimg);
        }else if(curframe.size().width==352){
            cv::Rect rect(0, 0, 352,288);
            curframe(rect).copyTo(tempimg);
        }
        //此处要进行判断,避免系统崩溃
        if(tempimg.size().width>0){
            bool jg1=cv::imwrite("./server/"+imageName+".jpg", tempimg);
            bool jg2=cv::imwrite("./web/server/"+imageName+".jpg", tempimg);
            if(jg1 and jg2)
            {
                return true;
            }else
            {
                return false;
            }
        }else{
            return false;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux下使用Qt调用海康视频流可以通过以下步骤实现: 首先,确保您的系统已经安装了Qt开发环境和海康视频流的驱动程序。在Qt Creator中创建一个新的Qt项目。 接下来,在Qt项目中创建一个视频流播放窗口。可以使用Qt的QVideoWidget作为播放视频的窗口,通过设置窗口的大小和位置,将其集成到主界面中。 然后,通过使用海康视频流的SDK接口,连接到相应的视频流源。这可以通过SDK提供的函数实现,如打开视频流、获取视频流帧等。根据需要配置视频流参数,例如IP地址、用户名、密码等。 在视频流启动后,通过定时器或线程定期获取视频流帧,然后将其显示在视频播放窗口中。可以使用Qt的QPixmap和QImage类来处理帧数据,并将其显示在Qt的QVideoWidget中。在绘制帧之前需要调用paintEvent()函数来重新绘制窗口。 最后,添加用户界面控件,例如按钮和滑块,以便控制视频流的播放、暂停和进度等。可以通过Qt Designer进行可视化布局,并使用适当的信号槽机制与SDK接口进行交互。 需要注意的是,具体的实现步骤和函数调用可能因所使用的海康SDK版本和具体需求而有所差异。因此,在进行调用时需要参考SDK提供的相关文档和示例代码。 ### 回答2: 在Linux下使用Qt调用海康视频流,需要进行以下步骤: 1. 首先,配置环境:在Linux系统中安装Qt和相应的开发工具链,以及海康威视提供的SDK。 2. 创建Qt项目:在Qt Creator中创建一个新的Qt项目,并选择适当的项目类型(如GUI或控制台应用程序)。 3. 设计界面:通过Qt Designer设计程序的界面,包括视频显示窗口和控制按钮等。 4. 添加海康SDK:将海康SDK提供的头文件和库文件添加到Qt项目中,确保编译器能够找到它们。 5. 编写代码:在Qt项目中,使用C++编写代码来调用海康SDK。例如,使用SDK提供的函数获取视频流,并将其显示在界面上的视频窗口中。 6. 构建和运行项目:使用Qt Creator构建项目,并在Linux系统上运行程序。确保已正确配置海康SDK的依赖项,并将相关的动态库文件放置在系统的搜索路径中。 7. 测试和调试:通过连接到海康设备并启动视频流,测试程序的功能。在必要时,使用Qt Creator的调试功能来定位和修复问题。 8. 优化和改进:根据实际需求,对程序进行优化和改进,以提视频流的稳定性和性能。 需要注意的是,海康SDK的具体使用方法和函数接口可能会因版本而异,具体的调用方式请参考海康SDK的文档和示例代码进行编程。 ### 回答3: 在Linux下使用Qt调用海康视频流,可以通过以下步骤实现: 1. 确保已经安装好Qt和相应版本的海康SDK。 2. 在Qt项目中,使用QMediaPlayer类来播放视频流。首先,在项目的.pro文件中添加`LIBS += -lqffmpeg`以加载ffmpeg库。然后,在代码中创建一个QMediaPlayer对象,并使用`setMedia(QUrl)`方法将海康视频流的URL作为参数传入。 3. 为了使用海康SDK提供的API,需要在代码中包含相关的头文件,并连接相应的库文件。 4. 初始化海康SDK,在初始化中设置相关参数和回调函数,以便接收视频流数据。 5. 在接收到视频流数据后,将数据传给QMediaPlayer对象进行播放。可以使用`QAbstractVideoSurface`类的子类来自定义视频流的处理方式,例如继承`QAbstractVideoSurface`并重写`present`方法来实现视频流的渲染。 6. 控制视频播放,例如播放、暂停、停止等操作,可以通过适当的UI控件和信号槽机制来实现。 需要注意的是,在使用海康SDK的API时,需要根据具体的功能和需求来选择合适的接口,并确保正确初始化和释放资源,在处理视频流数据时也需要注意数据的解码和渲染方式。 总之,通过以上步骤,我们可以在Linux下使用Qt调用海康视频流,并实现视频的播放和控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值