我使用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) 以下代码可以正常工作,直到程序运行时移除 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摄像头拔掉后如何停止程序?
我正在使用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) 我正在使用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?
我有一个相机类,在这个类中我使用了一个计时器,在它的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
如果有人需要更多信息,请告诉我.
调用堆栈没有多大帮助
令我惊讶的是,互联网上没有人有这个问题!
代码似乎很直接,可能是什么问题?
我在 winforms 中使用vlc 播放器。它工作正常,但问题是它的播放速度更快。
我有以 10fps 录制的视频。我认为 vlcControl 以 30fps 播放,这就是视频播放速度更快的原因。参考了this,但没有帮助。我set_play_back_speed在 vlcControl1.Video 下找不到任何类似函数的函数
我认为 vlcControl 会自动计算出 fps 并相应地播放。
如果我从安装在我的 Windows 电脑上的 vlc 媒体播放器打开相同的视频,它会以正确的速度播放。任何线索如何解决这个问题?
PS:如果我打开任何以 29.97fps 录制的视频,winforms 中的 vlcControl 会以适当的速度播放。
c++ ×3
opencv ×3
.net ×2
c# ×2
visual-c++ ×2
aforge ×1
c++-cli ×1
ffmpeg ×1
ironpython ×1
libvlc ×1
media-player ×1
python ×1
tensorflow ×1
tracking ×1
video ×1
winforms ×1