opencv2中代码在opencv3下运行时报错的修改一些方法

本文总结了从 OpenCV2 升级到 OpenCV3 的主要变化,包括命名规范的调整、API 更改等内容。重点介绍了 cv_ 前缀的废弃与替代方案,并列举了多个实例。
由于opencv3的主体实在opencv2的基础上进行的修改,部分opencv2的程序仍然可以在opencv3下运行。但是opencv3也做了部分的修改。网上关于这些的资料也不太多,在学习过程中遇到了一些问题,很是纠结无法解决,所以就在自己看opencv3时就总结了一些不同记录下来,希望有别人有所帮助。(其他的opencv2与opencv3的区别可以参考opencv3的官方文档(只有英文版睡觉)和《opencv3编程入门》,)
---------------------------------------------------------------------------------------------------

 opencv3中取消了opencv1中的"cv_"命名规范,对于这些cv_前缀的使用了新的命名规范。这里大概可以大概分为以下这几类。


(1)直接去掉"CV_"前缀


1)namedWindow中将cv_WINDOW_AUTOSIZE改为WINDOW_AUTOSIZE

2)line函数及其同一类的绘图函数,cv_filed改为filled

3)threshold函数中将cv_thresh_binary改为thresh_binary

4)remap函数中,cv_inter_linear改为inter_linear

5)鼠标操作函数setmousecallback中将cv_event_lbuttonup改为event_lbuttonup,等等一些直接将cv去除。

6)imwrite中,将cv_inpaint_telea改为inpaint_telea,cv_inpaint_ns改为inpaint_ns

7)设置摄像头尺寸时将cv_cap_prop_frame_width改为cap_prop_frame_width,cv_cap_prop_frame_height 改为 cap_prop_frame_height

..等等一些函数可以直接将前缀去除。


(2)需要新的前缀


比较常用的一些如

1)line函数中一些绘函数中的参数,cv_AA改为LINE_AA

2)cvtColor函数中颜色转换系的宏,全替换为"COLOR_"前缀,如CV_BGR2HSV改为COLOR_BGR2HSV

3)normalize中,将cv_MINMAX改为NORM_MINMAX 等等


(3)其他


1)定义尺寸时将cvSize(-1,-1)改为Size(-1,-1)

2)在表示颜色时,将cv_RGB改为Scalar。

其中Videowriter中的fourcc,cv2.x版本中中形式为cv2.cv.fourcc,在cv3,0以上的版本中应为cv2.VideoWriter_fourcc,需要特别注意。

持续更新。。

<think> 首先,用户的问题是基于系统级指令和之前的上下文。用户说:"我想查找在arm架构下使用opencv resize方法报错退出的解决方案",所以我的回答需要解决这个具体问题。 系统级指令要求: - 行内数学表达式用 $...$,但这里可能不涉及数学公式。 - 独立公式用 $$...$$ 并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,如 [^1]。 用户提供了几个引用: - 引用[1]: 关于链接问题和OpenCV应用。 - 引用[2]: 关于模型量化,特别是OpenCV dnn模块。 - 引用[3]: 关于ARM架构下的系统问题,如miniconda安装、OpenCV视频捕获问题。 - 引用[4]: 关于下载onnxruntime for RISC-V。 用户的问题特定于ARM架构下OpenCV的resize方法报错退出。引用[3]特别相关,因为它讨论了ARM架构下的系统问题,包括OpenCV问题。用户提到在bullseye64系统上使用OpenCV调用cv2.VideoCapture有问题,解决方法是添加cv2.CAP_V4L。 用户的问题是关于resize方法,不是VideoCapture。所以,我需要基于这些引用和一般知识来提供解决方案。 关键点: - 用户在ARM架构上遇到OpenCV的resize方法报错退出。 - 可能的原因包括内存问题、依赖问题、编译问题或特定硬件不兼容。 - 从引用[3]看,系统版本(如buster vs bullseye)可能导致问题,用户建议刷系统到bullseye或其他版本。 可能的解决方案: 1. **检查系统版本和环境**:确保使用兼容的OpenCV版本。引用[3]提到buster64位系统不支持某些安装,建议使用bullseye版本。 2. **依赖问题**:确认所有OpenCV依赖如libopencv-imgproc等已正确安装。 3. **内存分配**:在ARM设备上,内存不足可能导致resize失败。检查输入图像大小和设备内存。 4. **OpenCV编译选项**:确保OpenCV编译启用了必要的后端,如NEON优化等。 5. **错误信息**:用户没有提供具体错误,建议检查错误日志。 6. **工作区解决方案**:从引用[3]看,修改VideoCapture参数解决了问题;或许resize方法也有类似需要调整参数的解决方案。 基于引用: - 引用[3]建议刷系统到bullseye版本来解决某些OpenCV问题。 - 对于VideoCapture,他们使用 cv2.VideoCapture(0, cv2.CAP_V4L) 来解决卡顿问题。 - 类似地,对于resize,可能需要检查输入格式或使用特定标志。 一般解决方案步骤: 1. **更新系统和OpenCV**:确保系统和OpenCV是最新版本。使用bullseye系统(Debian-based)。 2. **检查输入**:确保输入图像有效;在resize前检查图像是否为空或损坏。 3. **调试错误**:运行代码捕获异常并打印错误消息。 4. **内存管理**:在ARM设备上,使用较小的图像或优化内存使用。 5. **编译OpenCV**:从源码编译OpenCV,启用ARM优化(如NEON指令集)。 6. **替代实现**:如果resize失败,尝试其他图像缩放方法。 回答结构: - 清晰、逐步解释。 - 使用中文。 - 在末尾生成相关问题。 - 引用段落添加引用标识。既然引用是用户提供的,我应该引用它们如果相关。 例如: - 引用引用[3]关于系统版本的重要性。 最终回答大致框架: 1. 简介问题。 2. 提供解决方案步骤。 3. 基于引用给出建议。 4. 生成相关问题。 </think> ### ARM架构下OpenCV resize方法报错退出的解决方案 在ARM架构设备(如树莓派或嵌入式系统)上使用OpenCV的`resize`方法遇到报错退出,通常是由于内存管理问题、硬件兼容性、依赖缺失或系统配置不当引起的。基于您提供的引用内容(尤其是引用[3]中关于ARM系统环境的经验),并结合OpenCV常见问题,我整理出以下逐步解决方案。请确保您的系统环境稳定,优先考虑使用兼容的系统版本(如Debian bullseye)[^3]。 #### 解决方案步骤 1. **检查和更新系统环境**: - ARM架构对系统版本敏感。引用[3]指出,buster64位系统可能存在兼容性问题,建议刷写为bullseye64位桌面版(或其他稳定版本),这能显著减少OpenCV操作失败的风险[^3]。 - 更新系统和依赖: ```bash sudo apt update sudo apt upgrade sudo apt install libopencv-dev python3-opencv # 确保OpenCV核心依赖完整 ``` - 验证系统架构和OpenCV版本: ```bash uname -a # 检查ARM架构(如aarch64) python3 -c "import cv2; print(cv2.__version__)" # 确保版本≥4.5(推荐) ``` 2. **排查内存和输入问题**: - `resize`方法在ARM设备上容易因内存不足而失败(尤其是处理大图像)。检查输入图像是否有效: ```python import cv2 image = cv2.imread(&#39;input.jpg&#39;) if image is None: raise ValueError("输入图像加载失败") # 确保文件路径正确 # 添加异常捕获以调试 try: resized = cv2.resize(image, (new_width, new_height)) # 替换为您的尺寸 except Exception as e: print(f"错误信息: {e}") # 输出具体错误,如内存错误(MemoryError)或断言失败 ``` - 如果错误涉及内存,尝试减小图像尺寸或使用分批处理: ```python # 示例:分块缩放 small_image = cv2.resize(image, (image.shape[1]//2, image.shape[0]//2)) # 先缩小再操作 ``` 3. **优化OpenCV编译和配置**: - ARM设备性能有限,确保OpenCV编译启用了硬件加速(如NEON指令集)。引用[2]提到OpenCV的后端优化(如FP16模式),但`resize`依赖于基础库,建议从源码重新编译OpenCV: ```bash # 安装编译依赖 sudo apt install build-essential cmake libgtk2.0-dev pkg-config git clone https://github.com/opencv/opencv.git cd opencv mkdir build && cd build cmake -D CMAKE_BUILD_TYPE=RELEASE -D ENABLE_NEON=ON .. # 关键:启用NEON优化 make -j4 sudo make install ``` - 如果使用conda环境(引用[3]提到miniconda问题),确保环境一致: ```bash conda activate 环境名 # 避免版本冲突 pip install --upgrade opencv-python-headless # 推荐无头版本以减少依赖 ``` 4. **处理特定后端问题**: - 引用[3]中VideoCapture问题通过指定后端(`cv2.CAP_V4L`)解决,类似地,`resize`可能因默认后端不兼容而失败。尝试显式设置图像处理后端: ```python # 在resize前初始化上下文 cv2.setNumThreads(1) # 限制线程数以避免ARM多线程错误 # 或尝试使用V4L2后端(如果适用) ``` - 如果错误涉及量化模型(引用[2]),确保`resize`输入的图像数据类型一致(如避免INT8与FP32混合): ```python image = image.astype(np.float32) # 转换为浮点数类型 ``` 5. **回退到替代方法**: - 如果`cv2.resize`持续失败,使用Pillow库或其他轻量替代: ```python from PIL import Image image = Image.open(&#39;input.jpg&#39;) resized = image.resize((new_width, new_height)) resized.save(&#39;output.jpg&#39;) # 然后使用OpenCV加载处理 ``` #### 注意事项 - **错误分析**:常见错误包括 `Segmentation fault`(内存溢出)或 `cv2.error: OpenCV resize failed`(输入无效)。记录错误日志是诊断关键。 - **预防措施**:维护良好的代码习惯,如避免重复定义依赖(引用[1]),并定期更新系统。 - **性能权衡**:在ARM设备上,优先使用小尺寸图像或降低分辨率以提高稳定性[^3]。 如果上述步骤无效,请提供具体错误信息,以便进一步调试。 ### 相关问题 1. 如何在ARM架构上优化OpenCV的整体性能? 2. OpenCV的resize方法在不同硬件后端(如V4L2、GStreamer)下的差异是什么? 3. 如何处理ARM设备上的OpenCV内存泄漏问题? [^1]: 通过上述步骤,大多数链接问题都可以得到解决。当然,良好的代码编写习惯,例如避免重复定义,保持版本一致性,都是预防链接问题的有效措施。 [^2]: 模型量化 (Quantization): 将模型权重和/或激活值从32位浮点数 (FP32) 转换为较低位宽的整数 (如INT8) 或16位浮点数 (FP16)。优点: 显著减小模型大小 (例如,FP32 -> INT8 模型大小减小约4倍)。加快推理速度 (INT8运算通常比FP32快,尤其是在支持INT8指令集的硬件上)。降低功耗。 [^3]: 问题 安装miniconda问题,出现conda.exe定位不到pytorch安装提示平台报错usb摄像头卡顿问题配置源出现公钥问题 个人经历感觉: 前两个问题是因为系统的问题使用了buster64位的系统,这个系统挂着aarch64位的皮,但不支持64位的pytorch的离线安装,还有个创建环境pip非法,使用克隆环境就可以了。 直接建议刷成bullseye版本的(也就十几分钟),我使用的是第一代版本的bullseys64位桌面版。其他版本也行找到问题关键了,不想再试了,太恶心了。 第三个问题是bullseys64系统的问题,换了好几个系统,调用opencv或者fswebcam出现图片不清楚卡顿,这个在buster64位是没有任何问题的。 opencv解决方法:cap = cv2.VideoCapture(0) => cap = cv2.VideoCapture(0, cv2.CAP_V4L) 推测是默认使用的输入格式不对,使用gstreamer也没有问题,怎么修改默认不会。 1.安装bullseye系统。 [^4]: ③最后下载onnxruntime (下载该库很有可能不成功,不成功的原因有很多,有可能是镜像问题,有可能是缺少某个库或者框架) wget https://github.com/zhangwm-pt/onnxruntime/releases/download/riscv_whl_v2.6.0/hhb_onnxruntime_c920-2.6.0-cp311-cp311-linux_riscv64.whl ​ pip install hhb_onnxruntime_c920-2.6.0-cp311-cp311-linux_riscv64.whl。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值