Qt单元测试闪退ASSERT: “false“ in file qtestdata.cpp, line 92abort() has been called xx.exe解决方法

文章讲述了Qt单元测试过程中遇到的闪退问题,源于数据类型不匹配导致的ASSERT失败。通过将易混淆的数据类型强制转换为正确的类型(如将0转换为short),解决了测试集中的崩溃问题。

Qt单元测试数据集闪退:ASSERT: “false” in file qtestdata.cpp, line 92abort() 解决方法


问题描述`

Qt在使用单元测试数据集时,运行测试的时候闪退。看输出记录,错误原因是
qtestdata.cpp(92) : ASSERT: “false” in file qtestdata.cpp, line 92abort() has been called“xxx.exe”(Win32):
下面是发生错误的源码。

QTest::addColumn<short>("expectResult");
	QTest::addColumn<QVector<short>>("vec");
	QTest::addColumn<double>("target")
<think>我们遇到了一个错误,错误信息显示在文件 `qasciikey.cpp` 的第501行出现了断言失败 "false",然后程序被中止(Aborted)。这个错误通常与图形界面(GUI)相关,尤其是在使用OpenCV的imshow函数时,可能在树莓派上由于图形环境的问题而触发。 可能的原因: 1. 树莓派上未正确设置显示环境(例如在没有图形界面的终端中尝试显示图像)。 2. OpenCV的编译版本与树莓派系统兼容性问题。 3. 缺少必要的图形库或依赖。 解决方法: 方案1:避免使用imshow。在树莓派上运行图形界面程序有时不稳定,特别是通过SSH连接时。我们可以将处理后的图像保存到文件而不是显示。 方案2:使用虚拟帧缓冲器(如xvfb)来模拟显示环境。 这里我们采用方案1,修改代码,将显示图像改为保存图像。同时,我们也可以将边缘检测结果保存下来以供检查。 修改后的代码(去除了imshow,改为保存结果图像): </think>这个错误通常发生在树莓派上运行OpenCV或Qt应用程序时,特别是在使用图形显示功能时出现的问题。错误信息 `"false" in file qasciikey.cpp, line 501` 表明Qt库在处理键盘输入时发生了断言失败。以下是解决方案: ### 解决方法: 1. **使用虚拟帧缓冲器(Xvfb)** 在没有物理显示设备的情况下运行时,使用虚拟显示: ```bash sudo apt-get install xvfb xvfb-run -a python3 c.py ``` 2. **修改OpenCV代码避免显示窗口** 在代码中注释掉所有 `cv2.imshow()` 和 `cv2.waitKey()` 调用: ```python # 注释掉所有显示相关的代码 # cv2.imshow("Original", img) # cv2.imshow("Edges", roi_edges) # cv2.waitKey(0) # cv2.destroyAllWindows() # 改为保存结果图像 cv2.imwrite("result.jpg", img) cv2.imwrite("edges.jpg", roi_edges) ``` 3. **设置环境变量禁用GUI** 在运行前设置Qt的环境变量: ```bash export QT_QPA_PLATFORM=offscreen python3 c.py ``` 4. **安装完整Qt库**(如果必要) ```bash sudo apt-get install qt5-default ``` ### 错误原因解释: 1. **Qt库依赖问题** OpenCV的Python绑定在某些情况下依赖Qt库进行窗口显示,但树莓派默认安装的精简版Qt可能缺少必要组件 2. **无显示器环境** 当树莓派在没有连接显示器或通过SSH运行时,GUI子系统无法正常工作 3. **键盘输入处理异常** `qasciikey.cpp` 是Qt处理键盘输入的模块,在无输入设备的环境下会触发断言 ### 推荐解决方案: 修改Python脚本,完全避免GUI操作: ```python import cv2 import numpy as np def detect_runway(): img = cv2.imread("123321.jpg") if img is None: return img = cv2.resize(img, (640, 480)) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (5, 5), 0) edges = cv2.Canny(blurred, 50, 150) height, width = edges.shape mask = np.zeros_like(edges) roi_corners = np.array([[(0, height), (width, height), (width, int(height*0.6)), (0, int(height*0.6))]], dtype=np.int32) cv2.fillPoly(mask, [roi_corners], 255) roi_edges = cv2.bitwise_and(edges, mask) lines = cv2.HoughLinesP(roi_edges, rho=1, theta=np.pi/180, threshold=30, minLineLength=40, maxLineGap=20) if lines is not None: for line in lines: x1, y1, x2, y2 = line[0] cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 3) # 保存结果而非显示 cv2.imwrite("runway_result.jpg", img) cv2.imwrite("runway_edges.jpg", roi_edges) print("Processing complete. Results saved to runway_result.jpg and runway_edges.jpg") detect_runway() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值