ObjectDetection Android 在 openCV 中使用 yolo

ObjectDetection Android using yolo in openCV

我是 android 中使用 OpenCV 的初学者。我想使用 Yolo 检测对象。事情是 我不想使用 OpenCV 的相机侦听器 onCameraFrame 来获取帧。 我想使用 onPreviewFrame 监听器。如您所知,我们进入 byte[] 中的帧。 所以我不知道如何使用 OpenCV 将 byte[] 中的帧与 Yolo 连接。

这是我使用的代码,运行良好

 @Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

        Mat frame = inputFrame.rgba();
        Imgproc.cvtColor(frame, frame, Imgproc.COLOR_RGBA2RGB);
        Mat imageBlob = Dnn.blobFromImage(frame, 0.00392, new Size(416, 416), new Scalar(0, 0, 0), false, false);

        tinyYOLO.setInput(imageBlob);

        List<Mat> result = new ArrayList<>(2);
        List<String> outBlobNames = new ArrayList<>();
        outBlobNames.add(0, "yolo_16");
        outBlobNames.add(1, "yolo_23");

        tinyYOLO.forward(result, outBlobNames);
        .
        .
        .//SOME CODE HERE
        .

现在我想使用 onPreviewFrame:

 @Override
public void onPreviewFrame(byte[] data, Camera camera) {
    if (data == null)
        throw new NullPointerException();

//---------------------HERE I Don't know what to do---------------------

        Camera.Size size = camera.getParameters().getPreviewSize();
        Mat frame = new Mat(size.width,size.width CvType.CV_8UC1);
        frame.put(0, 0, data);
        Imgproc.cvtColor(frame, frame, Imgproc.COLOR_RGBA2RGB);
  //---------------------UP-------------------------------
        Mat imageBlob = Dnn.blobFromImage(frame, 0.00392, new Size(416, 416), new Scalar(0, 0, 0),false, false);

        tinyYOLO.setInput(imageBlob);

        final List<Mat> result = new ArrayList<>(2);
        final List<String> outBlobNames = new ArrayList<>();
        outBlobNames.add(0, "yolo_16");
        outBlobNames.add(1, "yolo_23");

        tinyYOLO.forward(result, outBlobNames);
        .
        .
        .//SOME CODE HERE
        .

第二个代码出现错误:

2020-01-23 15:26:55.279 30268-30268/com.thelonecoder.camera E/AndroidRuntime: FATAL EXCEPTION: main Process: com.thelonecoder.camera, PID: 30268 CvException [org.opencv.core.CvException: cv::Exception: OpenCV(3.4.5) /build/3_4_pack-android/opencv/modules/imgproc/src/color.hpp:255: error: (-2:Unspecified error) in function 'cv::CvtHelper::CvtHelper(cv::InputArray, cv::OutputArray, int) [with VScn = cv::Set<3, 4>; VDcn = cv::Set<3, 4>; VDepth = cv::Set<0, 2, 5>; cv::SizePolicy sizePolicy = (cv::SizePolicy)2u; cv::InputArray = const cv::_InputArray&; cv::OutputArray = const cv::_OutputArray&]' Invalid number of channels in input image: 'VScn::contains(scn)' where 'scn' is 1 ]

终于找到答案了:
我应该使用 3 个通道。

Mat frame = new Mat(size.height + size.height / 2, size.width, CvType.CV_8UC3); frame.put(0, 0, data); Imgproc.cvtColor(frame, frame, Imgproc.COLOR_RGBA2RGB);