简体   繁体   English

在 openCV 中使用 yolo 的 ObjectDetection Android

[英]ObjectDetection Android using yolo in openCV

I am a beginner in using OpenCV in android.我是在 android 中使用 OpenCV 的初学者。 I want to detect the objects using Yolo.我想使用 Yolo 检测物体。 The thing is I don't want to use OpenCV's camera listener onCameraFrame for getting frames.问题是我不想使用 OpenCV 的相机监听器onCameraFrame来获取帧。 I want to use onPreviewFrame listener.我想使用onPreviewFrame侦听器。 As you know we go the frames in byte[] .如您所知,我们使用byte[]的帧。 So I don't know how to connect frames in byte[] with Yolo using OpenCV.所以我不知道如何使用 OpenCV 将byte[]帧与Yolo连接起来。

Here is the code that I used and it is working well这是我使用的代码,它运行良好

 @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
        .

And now I want to use onPreviewFrame :现在我想使用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
        .

And with the second Code I got errors:使用第二个代码我得到了错误:

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>; 2020 年 1 月 23 日 15:26:55.279 30268-30268/com.thelonecoder.camera E/AndroidRuntime:致命异常:主进程:com.thelonecoder.camera,PID:30268 CvException [org.opencv:cvvException:CvException :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) [VScn = cv::Set<3, 4>; VDcn = cv::Set<3, 4>; VDcn = cv::Set<3, 4>; VDepth = cv::Set<0, 2, 5>; VDepth = cv::Set<0, 2, 5>; cv::SizePolicy sizePolicy = (cv::SizePolicy)2u; cv::SizePolicy sizePolicy = (cv::SizePolicy)2u; cv::InputArray = const cv::_InputArray&; cv::InputArray = const cv::_InputArray&; cv::OutputArray = const cv::_OutputArray&]' Invalid number of channels in input image: 'VScn::contains(scn)' where 'scn' is 1 ] cv::OutputArray = const cv::_OutputArray&]' 输入图像中的通道数无效:'VScn::contains(scn)' 其中 'scn' 为 1 ]

Finally, I found my answer:最后,我找到了我的答案:
I should have used 3 channels.我应该使用 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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM