既に darknet は OpenCV 4.x 用に fork されていますが、そうとは知らず OpenCV 4.2.0 でコンパイルして躓いたところのメモです。OS は x86_64 Ubuntu 18.02.3 です。なお、CUDA 10.0, cuDNN 7.5 がインストール済みになっています。
OpenCV をインストールする前に ffmpeg 関連のファイルをインストールしておきます。apt-get によるインストールで問題ありません。
OpenCV は WITH_V4L, OPENCV_GENERATE_PKGCONFIG を ON にしておきます。Cmake を使って Makefile を生成し、make -j 4 などでコンパイルは普通に行います。出来たら make install で /usr/local 以下などにインストールします。
次に darknet をコンパイルする訳ですが、実行してみればわかりますが、image_to_ipl, ipl_to_image で使用されなくなった OpenCV API を使おうとしてコンパイルが停止します。直接 cv::Mat API を使用することにして image_opencv.cpp に以下のような修正をかけました。
Mat image_to_mat(image im) { Mat m = Mat(im.h, im.w, CV_8UC(im.c)); if (im.c == 1) { for (int row = 0; row < im.h; ++row) { uchar *dst = m.ptr(row); float *src = &im.data[row * im.w]; for (int col = 0; col < im.w; ++col) { dst[col] = (uchar)(src[col] * 255); } } } else { for (int row = 0; row < im.h; ++row) { Vec3b *dst = m.ptr(row); float *src = &im.data[row * im.w]; for (int c = 0; c < im.c; ++c) { for (int col = 0; col < im.w; ++col) { dst[col][2 - c] = (uchar)(src[c * im.h * im.w + col] * 255); } } } } return m; } image mat_to_image(Mat mat) { image im = make_image(mat.cols, mat.rows, mat.channels()); float *data = im.data; if (mat.channels() == 1) { for (int row = 0; row < im.h; ++row) { uchar *src = mat.ptr(row); for (int col = 0; col < im.w; ++col) { data[row * im.w + col] = (float)(src[col] / 255.0); } } } else { for (int row = 0; row < im.h; ++row) { Vec3b *src = mat.ptr(row); for (int c = 0; c < im.c; ++c) { for (int col = 0; col < im.w; ++col) { data[c * im.w * im.h + row * im.w + col] = (float)(src[col][2 - c] / 255.0); } } } } return im; }
更に、CV_CAP_PROP_ などと CV_ が付いているパラメータについて、CV_ を削除します。これでコンパイルが通るはず。
おまけ: Anaconda は外しておいた方がよいようです。カメラを使う場合はユーザを video グループに参加させるのを忘れずに。