0

我有这个代码使用 c#。

public partial class MainForm : Form
{

    private CvCapture VideoCapture;

    private IplImage frame;
    private IplImage imgMain;

    public MainForm()
    {
        InitializeComponent();
    }



    private void btnVideo_Click(object sender, EventArgs e)
    {
        double vidWidth, vidHeight;

        try
        {
            VideoCapture = highgui.CvCreateCameraCapture(0);
        }
        catch (Exception except)
        {
            MessageBox.Show(except.Message);
        }

        if (btnVideo.Text.CompareTo("Start Video") == 0)
        {

            if (VideoCapture.ptr == IntPtr.Zero)
            {
                MessageBox.Show("badtrip ah!!!");
                return;
            }

            btnVideo.Text = "Stop Video";

            highgui.CvSetCaptureProperty(ref VideoCapture, highgui.CV_CAP_PROP_FRAME_WIDTH, 640);
            highgui.CvSetCaptureProperty(ref VideoCapture, highgui.CV_CAP_PROP_FRAME_HEIGHT, 480);

            highgui.CvQueryFrame(ref VideoCapture);

            vidWidth = highgui.cvGetCaptureProperty(VideoCapture, highgui.CV_CAP_PROP_FRAME_WIDTH);
            vidHeight = highgui.cvGetCaptureProperty(VideoCapture, highgui.CV_CAP_PROP_FRAME_HEIGHT);

            picBoxMain.Width = (int)vidWidth;
            picBoxMain.Height = (int)vidHeight;


            timerGrab.Enabled = true;
            timerGrab.Interval = 42;
            timerGrab.Start();

        }

        else
        {
            btnVideo.Text = "Start Video";
            timerGrab.Enabled = false;

            if (VideoCapture.ptr == IntPtr.Zero)
            {
                highgui.CvReleaseCapture(ref VideoCapture);
                VideoCapture.ptr = IntPtr.Zero;
            }
        }
    }

    private void timerGrab_Tick(object sender, EventArgs e)
    {
        try
        {
            frame = highgui.CvQueryFrame(ref VideoCapture);

            if (frame.ptr == IntPtr.Zero)
            {
                timerGrab.Stop();
                MessageBox.Show("??");
                return;
            }

            imgMain = cxcore.CvCreateImage(cxcore.CvGetSize(ref frame), 8, 3);

            picBoxMain.Image = highgui.ToBitmap(imgMain, false);

            cxcore.CvReleaseImage(ref imgMain);
            //cxcore.CvReleaseImage(ref frame);
        }
        catch (Exception excpt)
        {
            MessageBox.Show(excpt.Message);
        }
    }
}

问题是在我打破所有并逐步通过调试器后,程序在某个代码处停止。

它停止的代码在这里: frame = highgui.CvQueryFrame(ref VideoCapture); 错误是它说无法评估表达式,因为本机框架位于调用堆栈的顶部。

然后当我尝试 shift+F11 时。还有另一个错误说system.accessviolationexception。

堆栈跟踪说:在 System.Runtime.InteropServices.Marshal.CopyToManaged(IntPtr source, Object destination, Int32 startIndex, Int32 length) 在 CxCore.IplImage.get_ImageDataDb()

这是我将使用的 c# opencv 包装器从 cvlib 更改为 cvwrapcs230d 时遇到的错误。

项目中使用的 DLL 也包含在该文件夹中。

但是当我将包装器从 cvwrapcs230d 更改为 cvwrap230 时,这是我得到的错误。

第一个注释是使用的 cvwrapcs230d 包装器,而第二个是 cvwrapcs230 包装器。

第一个注意事项: cvwrapcs230d - 抛出:“无法加载 DLL 'cvwrapcpp230':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)”(System.DllNotFoundException)异常消息 =“无法加载 DLL 'cvwrapcpp230':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)”,异常类型 =“System.DllNotFoundException”异常消息“无法加载 DLL 'cvwrapcpp230':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E) " string Exception Type "System.DllNotFoundException" string -Thrown: "'cvlib' 的类型初始化程序引发了异常。" (System.TypeInitializationException) Exception Message = "'cvlib' 的类型初始化程序引发了异常。

第二注:cvwrapcs230 - 抛出:“无法加载 DLL 'cvwrapcpp230':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)”(System.DllNotFoundException)异常消息 =“无法加载 DLL 'cvwrapcpp230':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)”,异常类型 =“System.DllNotFoundException”异常消息“无法加载 DLL 'cvwrapcpp230':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E) " string 异常类型 "System.DllNotFoundException" string -cvCreateCameraCapture cvlib.cvCreateCameraCapture(index = {unknown}) index {unknown} int

4

0 回答 0