- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 Visual Studio 2010 中有一个多线程 C++ Windows 项目,它使用 Qt (5.1.1) 和 OpenCV (2.4.8)。当我在 Debug 模式下构建它时,一切都运行良好,但是当我在 Release 模式下构建它时,程序崩溃了。两种配置几乎相同(只是在 Release 中我有多线程 DLL/MD 和在 Debug 中多线程调试 DLL/MDd),我禁用了 Release 的优化,甚至启用调试来捕获错误。最奇怪的是,同一段崩溃的代码,在另一个控制台项目中运行得很好。
错误是 OpenCV 代码的内部错误,与我的代码无关,我的代码只是:
void MyProject::findEllipses(QImage &frame, vector<RotatedRect> &ellipses)
{
Mat image = Mat(frame.height(), frame.width(), CV_8UC4, frame.scanLine(0));
cvtColor(image, image, CV_RGB2GRAY);
GaussianBlur(image, image, Size(3, 3), 0, 0, 4);
threshold(image, image, treshVal, 255, THRESH_BINARY);
vector<vector<Point> > contours;
Mat contoursImage = image.clone();
findContours(contoursImage, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE, Point(0, 0));
// ....Mode Code
正如我在 Debug 中所说,代码运行没有问题,findContours
调用 _contours.create(total, 1, 0, -1, true);
(在 OpenCV 的 contours.cpp 的第 1720 行)并继续使用该方法....但是在 Release 中,当我进入 _contours.create(total, 1, 0 , -1, true)
,程序不会执行该方法,而是跳转到 void _OutputArray::clear() const
(matrix.cpp 的第 1674 行)并陷入其中,因为它在第一行调用 int k = kind();
,而不是调用 cv::kind()
,而是调用:
int _InputArray::type(int i) const
{
int k = kind();
再次调用 kind()
再次调用 type()
(而不是它应该的 kind()
),生成无限递归循环,带来堆栈溢出。
我尝试创建一个新的 Visual Studio 2010 项目以查看这是否是项目创建问题,但问题仍然存在。
我的猜测是函数地址在 Release模式下是错误的,所以当它尝试调用 create()
时,它反而调用了另一个地址,在堆栈中造成困惑,但这只是我的猜测.起初我会责怪 OpenCV 发布 dll,但是,正如我所说,在另一个仅运行该特定代码的控制台项目中,该代码在机器人构建模式下运行良好。我没有看到我的其他线程和代码如何触发此行为,因为错误归结为 OpenCV 中的错误函数调用。
这超出了我的知识范围,我不知道如何解决这个问题,我很感激在这个问题上能得到的所有帮助,因为我已经用尽了我所有的想法来解决它....
编辑:
我做了一个小项目,这样任何人都可以看到发生了什么。
文件位于: https://app.box.com/s/3owljl44emv57erinrf8
为了运行它,您必须拥有 OpenCV 2.4.8 和 Qt 5.1.1 并配置 Visual Studio 2010 项目以从正确的位置获取包含文件。在资源文件夹中有一个将要加载的图像,在 SaraVisualControl.cpp 的第 20 行中,您必须放置正确的图像路径,抱歉我没有自动设置,但我急于将其打包一个小项目。关于如何运行它的任何其他问题,请告诉我。
编辑 2
我找到了这个旧线程:http://code.opencv.org/issues/2218用户似乎遇到了与我相同的问题,只需在关闭 OPENCV_CAN_BREAK_BINARY_COMPATIBILITY 的情况下运行 CMake 即可解决问题。但是这个选项不再出现在新版本的 OpenCV 中,如此处所述 http://code.opencv.org/issues/2358 .有谁知道这意味着什么以及它可能如何相关?
最佳答案
我过去在混合 VC 运行时版本时遇到过类似的症状。如果您在 VC2010 中工作,而 OpenCV 2.4.8 是在 2012 年甚至 2013 年构建的,那么您的 ABI 不匹配。例如,std::vector 在内存中的布局不同,可能某处 vtable 中某些方法的顺序发生了变化等。
一个简单的测试方法是在调试时检查“模块”窗口并查找更高版本的运行时 dll。你的是 msvcr100d.dll,如果你看到 msvcr110d 或 120d - 这可能是来源。(假设你和 OpenCV 都动态链接到 CRT - 我不能告诉)。
关于C++ 编译引入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21998478/
在开始之前,我想指出的是,我已经通过Google进行了一次诚实而真实的搜索,涉及范围很广,无法找到。 我需要(对于我正在开发的项目)所有Delphi(从2007年到最新发布的版本,我不再支持任何早于2
我正在使用 RPM 将 Liquibase 数据库迁移添加到我们当前的产品部署中,并正在寻找一些有关如何实现我的预期目标的建议/技巧。 最好,RPM 能够安装在全新且 Shiny 的开发人员环境以及现
我目前正在使用一本书学习 UITableViewCell。为了在滚动时重用单元格,作者要求修改原始代码以包含一个if()。检查特定重用标识符的单元格是否存在的语句。但是,在添加 if() 之后语句,X
在 C++ 中引入 protected 访问说明符背后的基本原理是什么。举个例子会有帮助。 最佳答案 对于这类问题,我推荐 Bjarne Stroustrup 的The Design And Evol
我正在尝试使用模板参数中给定的维度和类型创建一个可重用的矩阵类。结构本身就是: template struct Matrix { T elements[N* M]; }; 当我尝试实现矩阵乘
我有一个简单的查询: $query1="SELECT * FROM wp_users WHERE now() < (last_login + INTERVAL 6 month)"; $resu
在 Ioke doc 中,ISpec 测试包含在文档中,参见 ioke.org/dok/index.html 这如何用 Ruby 的 RSpec 和 RDoc(或 SDoc)来完成?我找不到任何命令行
在客户端/服务器通信中,我看到来自客户端的 TCP ZeroWindow。 在这种情况之后预期的场景是什么(设置和发送什么标志)? 以下是我可能得到的日志。在这种情况下,服务器发送 RST 数据包来终
来自wikipedia关于 Lambda 函数和表达式的文章: users will often wish to define predicate functions near the place w
我有一个由父 POM 和几个子模块组成的 Maven 项目。它在 Intellij 中编译和运行良好(我假设它使用 javac 而不是 Maven)。 当我运行 maven clean install
所以我刚开始使用 d3.js,但我一直收到 JavaScript 错误,我不知道为什么。我刚刚用 svg 创建了三个圆圈,想用 d3 选择它们。这是我的代码:
Objective C 引入了一种称为 ARC 的技术,以将开发人员从内存管理的负担中解放出来。听起来不错,如果g++也有这个功能,我想C++开发者会很高兴的。 ARC allows you to p
在 package.json 添加 "font-awesome": "^4.7.0" 执行 npm install 在 main.js 引入
为什么 WSDL 引入 wsdl:message?和消息部分? 与在操作参数(输入、输出、故障)中直接使用 XSD 相比,他们可以带来什么优势? 它们(带有 wsdl 消息部分的 wsdl 消息)如何
I already read doc here : https://github.com/laravel/framework/pull/25997 我想知道的是使用 withCount()我们只是加载
我已经为此苦苦挣扎了一段时间,但不太明白发生了什么。我有一个包含 Sides(通常是 2 个)的 Card 实体 - 并且 Cards 和 Sides 都有一个 Stage。我正在使用 EF Code
下面的 swiftUI 代码在 iOS13 上运行良好,但是在使用 iOS14 进行测试时,我在尝试显示模式表时遇到了由强制解包选项引起的 fatal error 。据我所知,工作表不应该尝试为 se
出于个人原因,我需要记忆一下 jsp 上的一些事情 :) 我有一个简单的登录页面: Login First name:
据我了解,PYTHONCASEOK 选项允许通过不区分大小写的匹配来导入模块。但是,由于 python 中的几乎所有内容都区分大小写,为什么它必须启用此选项以实现更惰性的写入。 还有什么介绍的理由吗?
全新的早午餐(和 bower )。我通过 bower 安装了 Bootstrap,我有以下早午餐配置文件: exports.config = # See http://brunch.io/#doc
我是一名优秀的程序员,十分优秀!