gpt4 book ai didi

java - OpenCV 的 drawContours 函数导致 Android 应用程序崩溃

转载 作者:行者123 更新时间:2023-12-02 03:25:20 26 4
gpt4 key购买 nike

我想在我的 Android 应用程序中绘制 Imgproc.findContours 检测到的最大轮廓。 Imgproc.findContours 似乎找到了一堆轮廓,但是当它尝试执行 Imgproc.drawContours 函数时代码崩溃了。

这是 Java 代码:

List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
Imgproc.findContours(result, contours, hierarchy, Imgproc.RETR_FLOODFILL, Imgproc.CHAIN_APPROX_SIMPLE);

largest_area = 0;
largest_contour_index = -1;

for(int i = 0; i<contours.size(); i++){
double area = Imgproc.contourArea(contours.get(i));
if(area > largest_area){
largest_area = area;
largest_contour_index = i;
}
}

Mat contourDrawing = Mat.zeros(result.rows(), result.cols(), CvType.CV_8UC3);

Log.d("contours.size()", Integer.toString(contours.size()));
Log.d("largest_area", Double.toString(largest_area));
Log.d("largest_contour_index", Integer.toString(largest_contour_index));

Imgproc.drawContours(contourDrawing, contours, largest_contour_index, new Scalar(255, 0, 0), 2);

Logcat输出如下,显示检测到轮廓:

D/contours.size(): 1901

D/最大区域:343974.0

D/最大轮廓指数:825

但是当使用 Imgproc.drawContours 绘制轮廓时,应用程序崩溃了。我使用的是 OpenCV 版本 3.4.3。有谁知道这里可能出了什么问题?非常感谢!

这是错误日志:

Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xb930b93 in tid 30396 (Thread-2), pid 30213

/lib/arm64/libopencv_java3.so (cv::drawContours(cv::_InputOutputArray const&, cv::_InputArray const&, int, cv::Scalar_<double> const&, int, int, cv::_InputArray const&, int, cv::Point_<int>)+2124)

/lib/arm64/libopencv_java3.so (Java_org_opencv_imgproc_Imgproc_drawContours_11+252)

/dev/ashmem/dalvik-classes.dex extracted in memory from ==/base.apk (deleted) (org.opencv.imgproc.Imgproc.drawContours+102)

最佳答案

我不太了解 Java,但也许我可以提供帮助?

建议:1. 使用 numpy 的 zeros_like(image) 而不是仅仅为了简化事情并减少出现错误的机会而采用行和列怎么样?

根据我的经验,绘制轮廓会永远改变您绘制的图像。但是您只是为了轮廓创建了一个图像,所以您已经知道了这一点......

我对问题的猜测:

对于您对 drawContours 函数的输入,您的第二个参数应该是您的 findContours 中的“检测到的轮廓”...我真的不能告诉,但看起来像这可能就是您的结果。您是否尝试在轮廓参数中使用result(在本例中为contours_to_draw)?

在Python中我这样使用它:

cv.drawContours(copy__of_image, contours_to_draw, -1, color=desired_color, thickness=2)

-1用于绘制所有轮廓。如果您只想绘制一些,您可以通过更改此值来绘制第一个或第二个等,但如果您知道要绘制哪些轮廓,我建议将它们传递到contours_to_draw,而不是使用此参数来确定要绘制哪些轮廓画。我想您也已经知道了所有这些,但重述这些事情并没有什么坏处。

这有帮助吗?

关于java - OpenCV 的 drawContours 函数导致 Android 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56909939/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com