[英]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.