为何测试程序中cv::resize无法执行但cvtColor可正常运行?
分析cv::resize无法执行但cvtColor正常的问题
先看你给出的代码片段,我梳理几个最可能的原因:
输入矩阵
gray未正确初始化
你提到cvtColor可以正常运行,那大概率是你想用cvtColor把img转成gray?但如果你的代码里只是声明了Mat gray;,却没执行类似cvtColor(img, gray, COLOR_BGR2GRAY);这一步,那gray就是一个空矩阵(没有分配内存、没有像素数据)。resize需要输入矩阵有有效数据才能执行,空矩阵会直接导致操作失败;而cvtColor是因为你传入了有效的img作为输入,所以能正常工作。手动创建
smallImg时的潜在问题
你手动构造了smallImg的尺寸和类型,虽然类型CV_8UC1和gray匹配,但这里有两个细节要注意:scale的值是否合理?如果scale大于1,smallImg的尺寸会比gray大,但resize本身支持放大,不过如果gray是空的,这也没用。- 其实
resize不需要提前创建目标矩阵,它会自动根据指定尺寸分配内存。你可以试试简化代码:
这里直接用Mat gray; cvtColor(img, gray, COLOR_BGR2GRAY); // 确保gray被正确初始化 Mat smallImg; resize(gray, smallImg, Size(cvRound(img.cols/scale), cvRound(img.rows/scale)), 0, 0, INTER_LINEAR);Size指定目标尺寸,让resize自己创建smallImg,避免手动构造时可能出现的尺寸顺序错误(OpenCV里Size是宽×高,而Mat构造是行×列,也就是高×宽,你之前的代码虽然逻辑上尺寸顺序对应,但手动创建还是容易踩坑)。
其他可能的内存或环境问题
如果gray确实已经正确初始化,那可能是img尺寸过大,导致smallImg需要的内存超出系统限制?不过这种情况一般会直接崩溃,而且cvtColor处理大图像也会有同样问题,所以概率较低。另外可以检查OpenCV版本是否存在bug,或者编译时链接的库是否和运行时一致(比如Debug库和Release库混用)。
总结一下,最核心的排查点就是确认gray矩阵在执行resize前已经通过cvtColor得到了有效的像素数据——毕竟你不能对一个空矩阵做缩放操作,而cvtColor的正常运行只依赖输入的img有效,和gray后续是否被正确使用无关。
内容的提问来源于stack exchange,提问作者liu liaohua
相关产品推荐
相关产品推荐

