动态链接库和0cx000007b错误

本文分析了程序运行时报错0cx000007b的原因及解决方案,包括检查dll和lib的位数匹配、正确放置dll路径、确保DirectX已安装及解决兼容性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本人想在电脑上配置一个程序的环境,直接从官网下载了编译好的静态库lib和动态库dll,环境配置好之后编译也成功了,却无法运行,显示出错0cx000007b。出现这种情况的可能性是有很多种的,我在一一排查之后,才确定了我的原因。
1、dll和lib32位或者64位不匹配
一般我们都能正确配置lib,使lib和我们的编译生成环境的位数相同,否则就会报错,显示无法找到lib。但是如果dll位数不同,我们虽然能编译成功,但是因为dll是动态链接库,只有运行exe的时候,才会根据路径去链接dll,如果dll和你exe要求的位数不同,就会报出000007b的错误。
2、dll放置路径错误
dll正确的放置路径:放置在exe同一个文件夹内,或者放置system32和sysWOW64里面,这里需要注意的是system32放的是64位的dll,而sysWOW64放置的是32位的dll,如果颠倒的话可能也会出错。
3、directX的问题
网上很多都会提到DirectX的问题,如果系统没有安装,也会出现000007的错误,建议去网上下载一个进行安装。
4、dll和lib与你的系统环境不兼容
这个就是我所碰到的问题,我的系统是win10、64位,在我保证上述这几个问题都解决的情况下,我的程序仍然报出000007b的错误。我直接编译了一个dll文件,测试发现和exe链接是没问题的,所以我猜测是兼容性的问题。于是使用cmake从网上下载源码,编译生成lib和dll文件,加入程序后成功运行。因此建议尽量不要直接下载官网编译好的库,多用cmake编译自己,可以避免很多不必要的错误浪费时间。
(本人刚转入计算机,很多术语可能有问题,望见谅)

### 使用C++实现SGBM算法生成视差图深度图 #### 准备工作 为了使用OpenCV中的半全局块匹配(Semi-Global Block Matching, SGBM)算法来计算两幅图像之间的视差图,首先需要安装配置好支持C++开发环境以及OpenCV。确保已经成功编译并链接了必要的头文件动态链接库。 #### 创建项目结构 创建一个新的C++工程,在源码目录下新建`main.cpp`作为入口程序文件,并引入所需的OpenCV头文件: ```cpp #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char* argv[]) { // ... } ``` #### 加载输入图片 读取左相机与右相机拍摄到的一对校准后的矩形化灰度图像用于后续处理: ```cpp Mat imgL = imread(argv[1], IMREAD_GRAYSCALE); Mat imgR = imread(argv[2], IMREAD_GRAYSCALE); if (imgL.empty() || imgR.empty()) { cout << "Can't read one of the images!" << endl; return -1; } ``` #### 初始化StereoSGBM对象 设置SGBM参数实例化一个`stereoMatcher`对象来进行立体匹配操作[^1]: ```cpp Ptr<StereoSGBM> stereoMatcher = StereoSGBM::create( 0, // minDisparity 16 * 5, // numDisparities 9, // blockSize 8 * 9 * 9, // P1 32 * 9 * 9, // P2 disp12MaxDiff=1, preFilterCap=63, uniquenessRatio=10, speckleWindowSize=100, speckleRange=32, mode=StereoSGBM::MODE_SGBM ); ``` 上述代码片段定义了一些常用的SGBM参数,具体含义如下: - `minDisparity`: 设置最小可能的视差值。 - `numDisparities`: 可能的最大视差减去最小视差之差;必须是16的倍数。 - `blockSize`: 匹配窗口大小,奇数值表示模板尺寸。 - `P1`, `P2`: 控制不连续性的惩罚项权重系数。 - `disp12MaxDiff`: 左右一致性检查时允许的最大差异。 - `preFilterCap`: 预过滤器上限阈值。 - `uniquenessRatio`: 唯一性比率。 - `speckleWindowSize`: 进行连通分量分析的小区域宽度。 - `speckleRange`: 单个连接组件内最大允许视差变化范围。 - `mode`: 指定使用的模式,默认为标准SGBM方法。 #### 计算视差图 利用初始化好的matcher执行实际的视差估计过程并将结果存储于名为disparity_map的结果矩阵中: ```cpp Mat disparity_map; stereoMatcher->compute(imgL, imgR, disparity_map); double minVal, maxVal; minMaxLoc(disparity_map, &minVal, &maxVal); // 获取视差图极值以便可视化显示 disparity_map.convertTo(disparity_map, CV_8UC1, 255 / (maxVal - minVal)); imshow("Disparity Map", disparity_map); waitKey(0); ``` 这段代码通过调用`compute()`函数完成双目视觉下的视差检测任务,并采用线性变换方式调整像素强度分布使得最终输出更易于观察理解。 #### 转换为深度图 基于已知基线距离\(B\)、焦距\(f_x\)及视差\(d\),可以按照公式\[Z=\frac{f_{x} \cdot B}{d}\]转换得到对应位置处物体的实际空间坐标\(z\)轴方向上的距离信息即所谓的“深度”。 假设给定了固定的摄像机内部参数矩阵K=[fx fy cx cy] 外部参数T=(Tx Ty Tz),其中cx,cy代表主点偏移量而Tx,Ty,Tz则描述了两个摄像头中心间的相对位移向量,则可以根据这些先验条件进一步求解三维重建问题。 对于每一个有效视差点(x,y,d),其对应的深度可由下面表达式给出: \[depth(x,y)=\left(\text {baseline } * f_{x}\right) /\left(d+\mathrm{~m}_{i n} D i s p a r i t y-\operatorname{shift}(x)\right)\] 这里需要注意的是当视差接近零的时候可能会导致除法运算溢出错误因此应当适当增加一个小常数防止这种情况发生。 最后将获得的浮点型深度数据映射回适合屏幕展示的形式即可形成完整的深度图象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值