я построил OpenCV двоичные файлы (.dll) с использованием CMake & Visual Studio, который генерируется .pdb файл, который помог мне найти проблему в коде (частично!)Отладка в Visual Studio без PDB файлов (C++ Access Voilation)
Как эта ошибка вызывается. ,
Я использую программное обеспечение, с помощью которого мы можем установить ограничение скорости интернет-загрузки (скорость передачи) для любой конкретной программы.
Теперь, если я подключаю IP-камеру к коду ниже, я заметил, что моему приложению требуется около 100 Кбит/с использования Интернета (скорость передачи) - только тогда я могу без проблем наблюдать за потоком в прямом эфире. Скажем, я сократил (установил) использование моего приложения в Интернете до 10Kb/s [Это причина аварии] В этом случае я должен иметь возможность видеть новый кадр раз в 4+ секунд.
Ошибка доступа к ошибке, вероятно, потому что (cap>>img;
) колпачок пытается достичь местоположения в баране & получить кадр, но нет кадра 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;
}
}
}
Если я использую весь код в одном классе (в одном заголовочном файле), нет никаких проблем на всех (новый кадр отображается после 4+ секунд без сбоев программы), но если я ставлю код в отдельный класс (другой файл заголовка), затем вызовите функцию, чтобы открыть камеру из объекта класса, затем она сбрасывает , еслиСкорость интернета сокращена.
странное поведение - если я отлаживаю шаг за шагом, он никогда не сбой!
, когда я построить библиотеку OpenCV с FFmpeg, я получаю .pdb файл только для OpenCV (opencv_world310.pdb) - поэтому ни один вопрос не отладки с использованием стека вызовов , но я не получаю PDB для FFmpeg (потому что Opencv_ffmpeg.dll прекомпилируется и вот где его сбой)
поэтому его трудно отлаживать, building ffmpeg не создает файл pdb, потому что он построен с использованием MSYS
, так что можно отлаживать то, что у нас есть?
я в том числе снимок с визуальной отладки студии, некоторые переменные, которые помогут в понимании:
typedef int (*CvGrabFrame_Plugin)(void* capture_handle); [cap_ffmpeg_api.cpp]
protected: void* ffmpegCapture; [cap_ffmpeg.cpp]
static CvGrabFrame_Plugin icvGrabFrame_FFMPEG_p = 0; [cap_ffmpeg.cpp]
Exception брошенным в 0x0A0AF6F0 (opencv_ffmpeg310.dll) в образце .exe: 0xC0000005: Место считывания нарушения доступа 0x00000020. Если для этого исключения есть , программа может быть безопасно продолжена.
в исходном коде я включен ниже линий & скомпилированных & использовал его в проекте - не получился, снова разбился! if(ffmpegCapture)
- null указатель проверки
можно ли внести изменения в строку 214 в [cap_ffmpeg.cpp], чтобы избежать сбоя?
Другие файлы заголовков - это только одна папка вверх.
Обновление: Я заметил, что программа сразу же срабатывает, когда я ограничиваю скорость интернет-потребления. Я использую C++/CLI (WinForms, целевая точка NET Framework = 4.6), у меня есть CameraClass (в отдельном заголовочном файле) & основной функции в (отдельный файл заголовка)
Основная функция имеет ниже код
CameraClass ^CC = gcnew CameraClass();
CC->OpenCamera();
Я не могу создать не управляемый тип объекта в управляемом классе, поэтому я поместил собственные типы (переменные Opencv) в отдельное пространство имен, как показано ниже, чтобы я мог использовать этот класс. возможно, мне нужно использовать внутренние указатели?
#pragma once
#include"opencv2\opencv.hpp"
#include <msclr\marshal_cppstd.h>
namespace SampleApp{
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Threading;
using namespace System::IO;
using namespace std;
namespace
{
cv::VideoCapture cap[5]; //max 5 instance for this class
cv::Mat image[5];
cv::IplImage pic1[5];
cv::IplImage *pic2[5];
}
public ref class CamWindow : public WeifenLuo::WinFormsUI::Docking::DockContent
{
public: CamWindow(void)
{
InitializeComponent();
}
Void OpenCamera()
{
}
.
.
.
.
};
}
определенно сошелся .net обработки & C++ памяти обработки памяти?
Вы проверяете 'cap.isOpened()' перед тем, как читать? – AndyG
Я тоже попробовал это вместе с grab & retrieve, он по-прежнему падает! потому что камера все еще будет открыта, только использование скорости интернета в приложении сильно сокращается .. –
Спасибо за ответ. Что вы подразумеваете под словом «open will be open»? Кроме того, когда вы переключились на 'grab' +' retrieve', на котором он умер? – AndyG