- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
大家 -- 我有一个 Heisenbug,在这里(只显示分离调试器!)。似乎在 C# 中与非托管互操作——如果我对 %TEMP% 目录执行 OpenCv cvSaveImage,没问题,但对于我尝试过的其他目录,它会抛出 AccVio 或挂起。以管理员身份运行,因此不是直接的安全问题。在 C# Visual Studio 2010 调试器下运行,它适用于任何目录。调试器分离 (ctrl F5) ... 崩溃或挂起!访问。
如有任何建议,我将不胜感激。我知道你们中的一些人在这个互操作层上生活和呼吸,但我没有工具和足够新的经验。我做了一个非常小的复制品供你玩
必须使用默认值安装 OpenCv2.2 [免费图像处理和计算机视觉 (cv)](2010 年 12 月版),来自 sourceforge.net/projects/opencvlibrary/
然后从 http://dl.dropbox.com/u/1997638/OpenCv2.2Test.zip 中选取我的 Visual Studio 2010 项目
它有包装器(感谢 Heiko Kießling,iib-chemnitz.de 的原创!)和一个带有注释的测试程序,可指导您找到可重复的错误。
再一次,如果有任何建议或线索,我将不胜感激!
编辑:@Aliostad:这是整个程序(减去包装器,它在我链接的 VS 项目中)
static void Main(string[] args)
{
CvLib.CvNamedWindow("TestWindow2", CvLib.CV_WINDOW_AUTOSIZE);
var img = CvLib.CvCreateImage(
CvLib.CvSize(256, 256),
depth: 8,
channels: 3);
var pts = new[] {
CvLib.CvPoint(0, 0),
CvLib.CvPoint(0, 255),
CvLib.CvPoint(255,255),
CvLib.CvPoint(255, 0)
};
CvLib.CvFillConvexPoly(
img: ref img,
pts: ref pts[0],
npts: 4,
color: CvLib.CV_RGB(0, 0, 255),
line_type: 8,
shift: 0);
CvLib.CvCircle(
img: ref img,
center: CvLib.CvPoint(128, 128),
radius: 20,
color: CvLib.CV_RGB(255, 255, 0),
thickness: 5,
line_type: 8,
shift: 0);
CvLib.CvShowImage(
name: "TestWindow2",
image: ref img);
var tempDirectory = Environment.GetEnvironmentVariable("TEMP");
var path = tempDirectory + @"\test.png";
CvLib.CvSaveImage(
path: path,
img: ref img);
MessageBox.Show("Click OK to exit");
CvLib.CvDestroyAllWindows();
}
在未连接调试器时将“路径”更改为任何其他内容会导致崩溃或挂起。
编辑:@Aliostad——这里是 cvSaveImage 的互操作代码。我确定我不理解 MarshalAs 属性,我猜这是问题的根源
public static void CvSaveImage(string path, ref IplImage img)
{
cvSaveImage(path, img.ptr);
}
[DllImport(HIGHGUI_LIBRARY, CallingConvention = CallingConvention.Cdecl)]
private static extern void cvSaveImage([MarshalAs(UnmanagedType.LPStr)] String filename, IntPtr img);
最佳答案
这是从 highgui.h 中检索到的 native cvSaveImage() 函数的声明:
CVAPI(int) cvSaveImage( const char* filename, const CvArr* image,
const int* params CV_DEFAULT(0) );
这是它的 pinvoke 声明,从包装器 HighGui.cs 中检索:
[DllImport(HIGHGUI_LIBRARY, CallingConvention = CallingConvention.Cdecl)]
private static extern void cvSaveImage([MarshalAs(UnmanagedType.LPStr)] String filename, IntPtr img);
请注意 native 声明如何具有三个 参数,而 pinvoke 声明只有两个。可以从 C++ 程序调用 native 函数并仅传递两个参数,编译器会自动为第三个参数应用默认值。但这对 pinvoke 编码器不起作用,它甚至不知道第三个参数是否存在。
结果是 native 函数为 params 参数获取任意值。当它不小心为 0 时它起作用。但是函数还有 40 亿种其他方法来获取非 null 参数,并在取消引用指针时立即处理访问冲突。失败是随机的。
通过编辑 pinvoke 声明并添加一个 IntPtr 作为第三个参数来解决这个问题。在 C# 代码中传递 IntPtr.Zero。
这是一个相当基本的错误,这个包装器会带来更多麻烦。
关于c# - 如果没有调试器,来自 C# interop 的 OpenCv 卡在 cvSaveImage 上!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4513787/
我正在尝试使用 opencv cvSaveImage 函数保存图像。问题是我正在对图像执行 DCT,然后更改执行 DCT 后获得的系数,之后我正在执行逆 DCT 以取回像素值。但是这次我得到了十进制的
我正在加载图像并使用 cvSaveImage() 保存相同的图像但使用不同的名称。保存后,新保存的图像的大小会增加。谁能告诉我为什么以及如何避免它?这是我的代码: int main(){ IplIma
我正在使用 OpenCV 并使用 cvSaveImage 函数保存为 jpeg,但我无法找到它使用的 Jpeg 压缩因子。 什么是 cvSaveImage(...) 的 Jpeg 压缩因子 如何在使用
我想使用下面的代码保存一个 IplImage(不是 IplImage*) IplImage ipl_from_mat((IplImage)imgDisparity8U); cvNamedWindow(
Hy 。我想做的是加载一堆图像,调整它们的大小并将调整后的图像保存到另一个文件夹。它加载图像,我检查过,并且工作正常,我唯一的问题是 cvSaveImage。例如: char num[350]="C:
我在 Ubuntu 15.10 上使用 Eclipse 和 OpenCV(版本 3)编写 C 程序,但我不明白为什么总是出现错误 undefined reference to symbol 'cvSa
这个问题在这里已经有了答案: OpenCV to use in memory buffers or file pointers (6 个答案) 关闭 9 年前。 我想把内存中的mat图片转换成JPG
我希望将内存中的 IplImage 转换为 JPEG 图像(以便通过套接字将其作为 M-JPEG 帧进行流传输)。我知道我可以为此使用 CvSaveImage,创建一个 jpeg 文件,我再次读取它,
大家 -- 我有一个 Heisenbug,在这里(只显示分离调试器!)。似乎在 C# 中与非托管互操作——如果我对 %TEMP% 目录执行 OpenCv cvSaveImage,没问题,但对于我尝
我是 OpenCV 的新手。在这种情况下,我尝试在进行一些处理后使用 cvSaveImage 保存图像,但是抛出了这个错误 Assertion failed ((flags & FIXED_TYPE)
我是一名优秀的程序员,十分优秀!