Android平台OpenCV调用net.forward触发-215断言失败问题求助
OpenCV Android: -215 Assertion Failed on
net.forward() (BatchNormLayer Issue) I'm following the official OpenCV tutorial to build an Android application, but I keep hitting a -215 Assertion failed error when calling net.forward(). So far, I haven't been able to resolve it.
Background & Troubleshooting Done
- Initially used OpenCV 3.4.3, which had Mat type compatibility issues. I've since upgraded to 3.4.7.
- Verified that the blob generated from the input frame has the correct dimensions.
- Tried multiple pairs of prototxt and caffemodel files—network loading succeeds every time, so file corruption isn't the issue.
- Confirmed the input frame is valid, the network instance isn't null, and network layers appear normal.
Key Code Snippets
// Load a network. public void onCameraViewStarted(int width, int height) { String proto = getPath("deploy.prototxt", this); String weights = getPath("MobileNetSSD_deploy.caffemodel", this); net = Dnn.readNetFromCaffe(proto, weights); Log.i(TAG, "Network loaded successfully"); } public Mat onCameraFrame(CvCameraViewFrame inputFrame) { // Get a new frame Mat frame = inputFrame.rgba(); Imgproc.cvtColor(frame, frame, Imgproc.COLOR_RGBA2RGB); // Forward image through network. Mat blob = Dnn.blobFromImage(frame, 0.007843, new Size(300, 300), new Scalar(127.5, 127.5, 127.5)); net.setInput(blob); Mat detections = net.forward(); //***215 ASSERTION FAILED occurs*** int cols = frame.cols(); int rows = frame.rows(); detections = detections.reshape(1, (int)detections.total() / 7); for (int i = 0; i < detections.rows(); ++i) { double confidence = detections.get(i, 2)[0]; if (confidence > 0.2) { int classId = (int)detections.get(i, 1)[0]; int left = (int)(detections.get(i, 3)[0] * cols); int top = (int)(detections.get(i, 4)[0] * rows); int right = (int)(detections.get(i, 5)[0] * cols); int bottom = (int)(detections.get(i, 6)[0] * rows); // Draw rectangle around detected object. Imgproc.rectangle(frame, new Point(left, top), new Point(right, bottom), new Scalar(0, 255, 0)); String label = classNames[classId] + ": " + confidence; int[] baseLine = new int[1]; Size labelSize = Imgproc.getTextSize(label, Core.FONT_HERSHEY_SIMPLEX, 0.5, 1, baseLine); // Draw background for label. Imgproc.rectangle(frame, new Point(left, top - labelSize.height), new Point(left + labelSize.width, top + baseLine[0]), new Scalar(255, 255, 255), Core.FILLED); // Write class name and confidence. Imgproc.putText(frame, label, new Point(left, top), Core.FONT_HERSHEY_SIMPLEX, 0.5, new Scalar(0, 0, 0)); } } return frame; } public void onCameraViewStopped() {} // Upload file to storage and return a path. private static String getPath(String file, Context context) { AssetManager assetManager = context.getAssets(); BufferedInputStream inputStream = null; try { // Read data from assets. inputStream = new BufferedInputStream(assetManager.open(file)); byte[] data = new byte[inputStream.available()]; inputStream.read(data); inputStream.close(); // Create copy file in storage. File outFile = new File(context.getFilesDir(), file); FileOutputStream os = new FileOutputStream(outFile); os.write(data); os.close(); // Return a path to file which may be read in common way. return outFile.getAbsolutePath(); } catch (IOException ex) { Log.i(TAG, "Failed to upload a file"); } return ""; }
Full Error Message
cv::Exception: OpenCV(3.4.7) /build/3_4_pack-android/opencv/modules/dnn/src/layers/batch_norm_layer.cpp:39: error: (-215:Assertion failed) blobs.size() >= 2 in function 'cv::dnn::BatchNormLayerImpl::BatchNormLayerImpl(const cv::dnn::experimental_dnn_34_v13::LayerParams&)'
I need the app to run without crashing. Any suggestions or solutions would be greatly appreciated!
内容的提问来源于stack exchange,提问作者André
相关产品推荐
相关产品推荐

