Почему мое обнаружение больших двоичных объектов OpenCV не работает?C#

Место общения программистов C#
Ответить
Anonymous
 Почему мое обнаружение больших двоичных объектов OpenCV не работает?

Сообщение Anonymous »

Я использую EmguCV для C#, и какую бы конфигурацию я ни пробовал, я не могу понять, почему мое обнаружение больших двоичных объектов не работает. Вот мой код:

Код: Выделить всё

public static void Process(string videoPath, string folderSavePath)
{
// Create video capture with memory safety
using VideoCapture videoCapture = new(videoPath);

// Get properties of video
int fps = (int)videoCapture.Get(CapProp.Fps);
int frameCount = (int)videoCapture.Get(CapProp.FrameCount);
Size size = new(videoCapture.Width, videoCapture.Height);
Size processSize = size / 4;

// Determine new path for video output
string videoName = Path.GetFileNameWithoutExtension(videoPath) + "_out" + ".mp4";
string videoSavePath = Path.Combine(folderSavePath, videoName);

// Create video writer with memory safety
using VideoWriter videoWriter = new(videoSavePath, VideoWriter.Fourcc('H', '2', '6', '4'), fps, size, true);

// Set up background subtraction
BackgroundSubtractorMOG2 backgroundSubtractor = new();
backgroundSubtractor.History = 30;
backgroundSubtractor.VarThreshold = 40;

// Set up blob detection
SimpleBlobDetectorParams blobDetectorParams = new()
{
FilterByArea = true,
FilterByCircularity = false,
FilterByConvexity = false,
FilterByInertia = false,
MinArea = 1,
MaxArea = 100_000
};
SimpleBlobDetector blobDetector = new(blobDetectorParams);
int blobs = 0;

// Read frames from video capture
Mat[] frames = new Mat[frameCount];
Mat sourceFrame = new();
while (videoCapture.Read(sourceFrame))
{
// Resize frame
Mat downsizedFrame = new();
CvInvoke.Resize(sourceFrame, downsizedFrame, processSize, interpolation: Inter.Linear);

// Subtract the background
Mat foregroundFrame = new();
backgroundSubtractor.Apply(downsizedFrame, foregroundFrame);

// Remove noise
Mat noiselessFrame = new();
CvInvoke.MedianBlur(foregroundFrame, noiselessFrame, 5);

// Convert to binary video
Mat binaryFrame = new Mat();
CvInvoke.Threshold(noiselessFrame, binaryFrame, 127, 255, ThresholdType.Binary);

// Blob detection
VectorOfKeyPoint keypoints = new VectorOfKeyPoint();
blobDetector.Detect(binaryFrame, keypoints);

// Draw blobs
Mat blobsFrame = new Mat();
Features2DToolbox.DrawKeypoints(binaryFrame, keypoints, blobsFrame, new Bgr(0, 255, 0));
blobs += keypoints.Size;

// Resize again
Mat upsizedFrame = new();
CvInvoke.Resize(blobsFrame, upsizedFrame, size, interpolation: Inter.Cubic);

// Write frame to video
videoWriter.Write(upsizedFrame);
}

Debug.Print($"Detected {blobs} blobs.");
}
Что очень расстраивает, так это то, что видео выводит четкие формы. Кажется, что мое вычитание фона и удаление шума работают довольно безупречно. Тем не менее, обнаружение больших двоичных объектов по-прежнему не удается.
Кстати, я понимаю, что рисую зеленые ключевые точки на двоичном изображении, которое, по моему мнению, на самом деле не может быть нарисовано. Это можно игнорировать. Я нарисую их в одном из своих небинарных фреймов, как только он заработает. Я использовал оператор печати, чтобы определить, были ли найдены какие-либо капли, а не само выходное видео.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ot-working
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»