小编Pra*_*h M的帖子

在没有Pdb文件的Visual Studio中进行调试(C++ Access Voilation)

我使用Cmake和visual studio构建了OpenCV二进制文件(.dll),它生成了.pdb文件,帮助我在代码中找到问题(部分!)

这次崩溃是如何造成的..
我正在使用一种软件,我们可以为任何特定程序设置互联网下载速度限制(传输速率).

现在,如果我将IP摄像头连接到下面的代码,我注意到我的应用程序需要大约100Kb/s的互联网使用率(传输速率) - 只有这样我才能无缝地观看直播.让我说我减少(设置)我的应用程序互联网使用量为10Kb/s [这是崩溃背后的原因] 在这种情况下,我应该能够在4秒内看到一个新的框架.

我收到访问冲突错误可能是因为(cap>>img;)上限试图到达ram中的位置并获取帧但是没有帧YET因为它仍然因为低网速而被下载.
很明显,指针到达ram中的某个位置以抓住尚未存在的帧.

一些有趣的行为...

Void OpenCamera()
{
    VideoCapture cap("http://192.168.1.3:8080/video?x.xmjpeg");
    Mat img;
    while(true)
    {
      try
      {
        if(cap.isOpened()) //also tried grab + retrieve, crashes at grab
        cap>>img; //code crashes here
      }
      catch(...)
      {
        cout<<"Camera Disconnected"<<endl;
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在同一个类中使用整个代码(在相同的头文件中),根本没有问题(新帧在4秒以上显示而不会使程序崩溃)但是如果我将代码放入一个单独的类(不同的头文件) ),然后调用该函数从类对象打开相机,然后如果减少 互联网速度它崩溃.
奇怪的行为 - 如果我一步一步调试,它永远不会崩溃!

当我使用ffmpeg构建opencv库时,我只获取opencv(opencv_world310.pdb)的.pdb文件 - 所以没有问题调试使用调用堆栈,但我没有得到fdb for ffmpeg(因为Opencv_ffmpeg.dll是预编译的,这是它崩溃的地方)

因此很难调试,构建ffmpeg不会产生pdb文件,因为它使用MSYS构建,
所以可以用我们的调试吗?

我包括来自visual studio调试的快照,一些有助于理解的变量:

typedef int (*CvGrabFrame_Plugin)( void* capture_handle );      [cap_ffmpeg_api.cpp]
protected: void* ffmpegCapture;                                 [cap_ffmpeg.cpp]
static CvGrabFrame_Plugin icvGrabFrame_FFMPEG_p = …
Run Code Online (Sandbox Code Playgroud)

c++ opencv memory-management c++-cli visual-c++

10
推荐指数
1
解决办法
589
查看次数

Opencv的image.empty()函数不起作用

以下代码可以正常工作,直到程序运行时移除 USB 摄像头。断开 USB 摄像头后,我看到一个空白图像,但程序应该停止,因为img_cam1.empty()!cap_cam1.isOpened()应该是真的。但由于某种原因,两者都是假的!

是什么原因造成的?

VideoCapture cap_cam1(0);
Mat img_cam1;

while(true)
{

    cap_cam1 >> img_cam1;

    if (img_cam1.empty() || !cap_cam1.isOpened())
    {                               
        cap_cam1.release();  
         break;                 
    }

    else {        
        imshow("Live",img_cam1); 
        if (!img_cam1.isContinuous())
           break;
        img_cam1.empty();               
        img_cam1.release();

        if(waitKey(33)==27) break; 
    }
}
Run Code Online (Sandbox Code Playgroud)

USB摄像头拔掉后如何停止程序?

c++ opencv video-capture image-processing

5
推荐指数
1
解决办法
1万
查看次数

失去目标时如何重设或更新KCF追踪器ROI

我正在使用KCF跟踪算法,我的问题是当目标从窗口退出时,跟踪器不会重置并错误地在窗口边缘显示矩形。在理想状态下,跟踪器应在失去目标后删除矩形。

这些是我的代码:

int main(int argc, char** argv) {
        Rect2d roi;
        Mat frame;

        // create a tracker object
        Ptr<Tracker> tracker = Tracker::create("KCF");

        VideoCapture cap("C2_0002.mp4");

        cap >> frame;
        resize(frame, frame, Size(frame.cols / 2, frame.rows / 2));
        roi = selectROI("tracker", frame);
        //quit if ROI was not selected
        if (roi.width == 0 || roi.height == 0)
            return 0;
        // initialize the tracker
        tracker->init(frame, roi);
        // perform the tracking process
        printf("Start the tracking process, press ESC to quit.\n");
        for (;; ) {

                // get frame …
Run Code Online (Sandbox Code Playgroud)

c++ opencv tracking

5
推荐指数
1
解决办法
2911
查看次数

IronPython:意外令牌“来自”

我正在使用IronPython从.net运行python脚本,下面是我的python脚本

import tensorflow as tf    
print('Tensorflow Imported')
Run Code Online (Sandbox Code Playgroud)

下面是C#代码

using System;
using System.Text;
using System.IO;
using IronPython.Hosting;
using System.Collections.Generic;
using Microsoft.Scripting.Hosting;

namespace ConsoleApplication1
{
    class Program
    {
        private static void Main()
        {
            var py = Python.CreateEngine();
            List<string> searchPaths = new List<string>();
            searchPaths.Add(@"C:\Users\Admin\AppData\Local\Programs\Python\Python35\Lib)");
            searchPaths.Add(@"C:\Users\Admin\AppData\Local\Programs\Python\Python35\Lib\site-packages)");
            py.SetSearchPaths(searchPaths);
            try
            {
                py.ExecuteFile("script.py");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }           
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我的输出

意外的令牌“来自”

如果我删除import语句,则python脚本可以正常执行。我尝试过将os,sys所有这些导入,都没有任何问题。我已经通过pip安装了TensorFlow,当我通过python console(v3.5)运行以上脚本时,它可以正常工作。

更新:在TF文档中,其书面内容“ TensorFlow仅支持Windows上的Python版本3.5.x ”。但是IronPython的正式版本是2.7版,我很高兴在GitHub上找到IronPython ,并尝试构建它(我只是在控制台中键入build,然后对显示的错误消息列表感到惊讶!:D找不到预编译的错误消息!二进制文件

有什么其他方法可以在IronPython 2.7中导入tensorflow或在.net中运行Python?

.net c# python ironpython tensorflow

5
推荐指数
1
解决办法
3743
查看次数

AForge.Video.FFMPEG.dll中发生AccessViolationException

我有一个相机类,在这个类中我使用了一个计时器,在它的tick事件中我使用AForge.NetC++/Cli中的VideoFileWriter 保存视频(x86,.net framework:v4.6).
这不应该发生,因为这是托管代码.但即使我在try catch块中包装,程序崩溃也是因为AccessViolationException.我已经验证Image不是null.与此有关VideoFileWriter.这种情况发生在应用程序开始到运行30分钟之间.

AForge.Video.FFMPEG.dll中出现未处理的"System.AccessViolationException"类型异常附加信息:尝试读取或写入受保护的内存.这通常表明其他内存已损坏.

在Visual Studio的输出中,我看到了

test.exe中的0x0C4D689F(swscale-2.dll)抛出异常:0xC0000005:访问冲突写入位置0x09F83D80.抛出异常:AForge.Video.FFMPEG.dll中的"System.AccessViolationException"

码:

 private: System::Void Video_Recorder_Tick(System::Object^  sender, System::Timers::ElapsedEventArgs^  e)
  {
      Bitmap^ save = ConvertMatToBitmap(image); //function to convert opencv's Mat to .net's Bitmap        
      if(writer!= nullptr)
       writer->WriteVideoFrame(save);
       delete save;
   }

  VideoFileWriter ^writer = gcnew VideoFileWriter();

  private: Void load_VideoWriter()
  {
    writer->Open("C:/video.avi", 640, 480, 10, VideoCodec::Default);        
  }
Run Code Online (Sandbox Code Playgroud)

Visual Studio显示的值很少 writer

BitRate 400000
编解码器默认
FrameRate 10
高度480
IsOpen true
宽度640


如果有人需要更多信息,请告诉我.
调用堆栈没有多大帮助

在此输入图像描述

令我惊讶的是,互联网上没有人有这个问题!
代码似乎很直接,可能是什么问题?

.net ffmpeg access-violation aforge visual-c++

5
推荐指数
1
解决办法
808
查看次数

在 vlc dot net (winforms) 中设置播放速度

我在 winforms 中使用vlc 播放器。它工作正常,但问题是它的播放速度更快。
我有以 10fps 录制的视频。我认为 vlcControl 以 30fps 播放,这就是视频播放速度更快的原因。参考了this,但没有帮助。我set_play_back_speed在 vlcControl1.Video 下找不到任何类似函数的函数
我认为 vlcControl 会自动计算出 fps 并相应地播放。
如果我从安装在我的 Windows 电脑上的 vlc 媒体播放器打开相同的视频,它会以正确的速度播放。任何线索如何解决这个问题?

PS:如果我打开任何以 29.97fps 录制的视频,winforms 中的 vlcControl 会以适当的速度播放。

c# video media-player winforms libvlc

2
推荐指数
1
解决办法
2601
查看次数