Na svém notebooku s W10, OpenCV 3.4.0, CUDA & CDNN a Visual Studio 2017 jsem si stáhl repozitář projektu YOLO v2 a úspěšně ho zkompiloval. Vše funguje jak má vč. rozpoznání objektů v demo videu:
darknet.exe detector demo data/voc.data yolo-voc.cfg yolo-voc.weights test.mp4 -i 0
Nechápu, proč se mi nedaří použí místo videa signál webcamery z notebooku:
darknet.exe detector demo data/voc.data yolo-voc.cfg yolo-voc.weights
U web kamery se na zlomek sekundy rozsvítí LEDka, že kamera naběhla, ale program vzápětí skončí s hláškou "Stream closed.: No error". Hláška je vidět v části demo.c viz níže
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/core/version.hpp"
#ifndef CV_VERSION_EPOCH
#include "opencv2/videoio/videoio_c.h"
#endif
image get_image_from_stream(CvCapture *cap);
static char **demo_names;
static image **demo_alphabet;
static int demo_classes;
static float **probs;
static box *boxes;
static network net;
static image in ;
static image in_s ;
static image det ;
static image det_s;
static image disp = {0};
static CvCapture * cap;
static float fps = 0;
static float demo_thresh = 0;
static float *predictions[FRAMES];
static int demo_index = 0;
static image images[FRAMES];
static IplImage* ipl_images[FRAMES];
static float *avg;
void draw_detections_cv(IplImage* show_img, int num, float thresh, box *boxes, float **probs, char **names, image **alphabet, int classes);
image get_image_from_stream_resize(CvCapture *cap, int w, int h, IplImage** in_img);
IplImage* in_img;
IplImage* det_img;
IplImage* show_img;
void *fetch_in_thread(void *ptr)
{
//in = get_image_from_stream(cap);
in = get_image_from_stream_resize(cap, net.w, net.h, &in_img);
if(!in.data){
error("Stream closed.");
}
//in_s = resize_image(in, net.w, net.h);
in_s = make_image(in.w, in.h, in.c);
memcpy(in_s.data, in.data, in.h*in.w*in.c*sizeof(float));
return 0;
}
Web kamera přitom v jiném projektu s krátkým kódem funguje v pohodě:
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int, char**)
{
VideoCapture cap(0); // open the default camera
if (!cap.isOpened()) // check if we succeeded
return -1;
Mat edges;
namedWindow("edges", 1);
for (;;)
{
Mat frame;
cap >> frame; // get a new frame from camera
cvtColor(frame, edges, CV_BGR2GRAY);
GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);
Canny(edges, edges, 0, 30, 3);
imshow("edges", edges);
if (waitKey(30) >= 0) break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}
Netušíte někdo, v čem může být problém ?