OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 6067|回复: 5

C# 调用C++ opencv DLL 遇到的问题

[复制链接]
发表于 2016-12-27 21:08:59 | 显示全部楼层 |阅读模式
用vc++ 写了简单的hash和phash函数依赖 opencv,能够独立运行。尝试导出了DLL,C#控制台程序能够调用不涉及到opencv的函数,调用opencv的关联函数的时候报错。

“System.BadImageFormatException”类型的未经处理的异常在 DLLTest.exe 中发生

其他信息: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)


VC++我配了环境,VC#没有,都是vs2013下的项目。

是因为opencv有依赖的库吗?
还是C#的环境也需要配?
如果使用emgucv的话,可以实现C#调用 C++ 的DLL吗?


回复

使用道具 举报

发表于 2016-12-27 22:53:49 | 显示全部楼层
你的这个原因可能是因为在csharp下面获取的图片数据,没有办法传递到dll中,让opencv处理。
这个问题比较难解决,推荐开源项目tinyimage
http://www.pudn.com/downloads507 ... /detail2107112.html
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-28 16:25:58 | 显示全部楼层
jsxyheu2014 发表于 2016-12-27 22:53
你的这个原因可能是因为在csharp下面获取的图片数据,没有办法传递到dll中,让opencv处理。
这个问题比较难 ...

你好,我整个业务都是由DLL处理, C# 只负责传入一个url,具体图片由 DLL中 Mat src = imread(pathh);
获取。不应该啊,C#应该不涉及图片处理,是DLL依赖的缘故吗?(:
回复 支持 反对

使用道具 举报

发表于 2016-12-28 23:46:49 | 显示全部楼层
那么你这个问题可能相对简单,应该是可以解决的。建议贴出更多错误信息。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-29 11:24:52 | 显示全部楼层
jsxyheu2014 发表于 2016-12-28 23:46
那么你这个问题可能相对简单,应该是可以解决的。建议贴出更多错误信息。
  1. // FeatureAlgorithmGroup.cpp : 定义 DLL 应用程序的导出函数。
  2. //

  3. #include "stdafx.h"
  4. #include "FeatureAlgorithmGroup.h"

  5. #include<cv.h>
  6. #include<string>
  7. #include<iostream>
  8. #include<highgui.h>
  9. #include <opencv2/opencv.hpp>
  10. #include <opencv2/core/core.hpp>   
  11. #include <opencv2/highgui/highgui.hpp>  
  12. #include "opencv2/imgproc/imgproc.hpp"  
  13. #include "opencv2/features2d/features2d.hpp"  
  14. #include "opencv2/core/core.hpp"

  15. using namespace cv;
  16. using namespace std;
  17. FEATUREALGORITHMGROUP_API  string _stdcall Hashcode(string path)
  18. {
  19.         string pathh = "C:\\Users\\WaKing\\Desktop\\算法测试图片库\\原图\\3C极米原图1.jpg";
  20.         Mat src = imread(pathh);
  21.         if (src.empty())
  22.         {
  23.                 char* str = "404 not found pricture";
  24.                 return  str;
  25.         }
  26.         string rst(64, '\0');
  27.         Mat img;
  28.         if (src.channels() == 3)
  29.                 cvtColor(src, img, CV_BGR2GRAY);
  30.         else
  31.                 img = src.clone();
  32.         /*第一步,缩小尺寸。
  33.         将图片缩小到8x8的尺寸,总共64个像素,去除图片的细节*/

  34.         resize(img, img, Size(8, 8));
  35.         /* 第二步,简化色彩(Color Reduce)。
  36.         将缩小后的图片,转为64级灰度。*/

  37.         uchar *pData;
  38.         for (int i = 0; i<img.rows; i++)
  39.         {
  40.                 pData = img.ptr<uchar>(i);
  41.                 for (int j = 0; j<img.cols; j++)
  42.                 {
  43.                         pData[j] = pData[j] / 4;
  44.                 }
  45.         }

  46.         /* 第三步,计算平均值。
  47.         计算所有64个像素的灰度平均值。*/
  48.         int average = mean(img).val[0];

  49.         /* 第四步,比较像素的灰度。
  50.         将每个像素的灰度,与平均值进行比较。大于或等于平均值记为1,小于平均值记为0*/
  51.         Mat mask = (img >= (uchar)average);

  52.         /* 第五步,计算哈希值。*/
  53.         int index = 0;
  54.         for (int i = 0; i<mask.rows; i++)
  55.         {
  56.                 pData = mask.ptr<uchar>(i);
  57.                 for (int j = 0; j<mask.cols; j++)
  58.                 {
  59.                         if (pData[j] == 0)
  60.                                 rst[index++] = '0';
  61.                         else
  62.                                 rst[index++] = '1';
  63.                 }
  64.         }
  65.        
  66.         return rst;
  67. }
复制代码
  1. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
  2. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities\12.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
  3. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
  4. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities.Sync\12.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
  5. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
  6. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\12.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
  7. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\Users\WaKing\Documents\Visual Studio 2013\Projects\DLLTest\DLLTest\bin\x86\Debug\DLLTest.vshost.exe”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
  8. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
  9. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml.Linq\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.Linq.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
  10. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Data.DataSetExtensions\v4.0_4.0.0.0__b77a5c561934e089\System.Data.DataSetExtensions.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
  11. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Microsoft.CSharp\v4.0_4.0.0.0__b03f5f7f11d50a3a\Microsoft.CSharp.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
  12. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
  13. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
  14. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_zh-Hans_b77a5c561934e089\mscorlib.resources.dll”。模块已生成,不包含符号。
  15. 线程 0x2978 已退出,返回值为 259 (0x103)。
  16. 线程 0x1450 已退出,返回值为 259 (0x103)。
  17. 线程 0x3f30 已退出,返回值为 259 (0x103)。
  18. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\Users\WaKing\Documents\Visual Studio 2013\Projects\DLLTest\DLLTest\bin\x86\Debug\DLLTest.exe”。已加载符号。
  19. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll”。已加载符号。
  20. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Accessibility\v4.0_4.0.0.0__b03f5f7f11d50a3a\Accessibility.dll”。已加载符号。
  21. “System.BadImageFormatException”类型的第一次机会异常在 DLLTest.exe 中发生
  22. “System.BadImageFormatException”类型的未经处理的异常在 DLLTest.exe 中发生
  23. 其他信息: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

  24. “DLLTest.vshost.exe”(CLR v4.0.30319: DLLTest.vshost.exe):  已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。
复制代码
vs2013 下 有opencv环境的VC++ 编写的DLL,可以去试一下调用。 不知道是DLL的问题,还是C#的问题,我用C++调用也没有成功。
回复 支持 反对

使用道具 举报

发表于 2016-12-30 07:36:48 | 显示全部楼层
如果c++调用也不成功的话,应该是dll的问题。
我想起之前有这方面的博客
csharp通过dll调用opencv函数,图片作为参数 http://www.opencv.org.cn/forum.p ... mp;page=1#pid359157
http://www.cnblogs.com/jsxyhelu/p/3971445.html
供参考
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-4-20 12:40 , Processed in 0.011077 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表