为了账号安全,请及时绑定邮箱和手机立即绑定

在 Android 中与 OpenCV 进行模板匹配时断言失败错误

在 Android 中与 OpenCV 进行模板匹配时断言失败错误

慕尼黑的夜晚无繁华 2022-04-28 16:46:13
我编写了一个OpenCV模板匹配类,Netbeans并且在JVM.只是我想把它变成android应用程序。但我以前对 Android 编程不感兴趣。所以我阅读了教程并决定IntentService看起来对我的目标很好。因为我不希望任何 UI 只处理图像并获取结果图像。我终于导入OpenCV了我的简单 Android 项目。Template Matching在Android中运行良好JVM但在Android中出现错误。只是我更改了 Android 的图像文件路径形式。并在JVM.- 编辑 -我将图像文件复制到 Android 虚拟设备下载文件夹。我用虚拟设备测试它。让我分享我的代码和结果;MyService.java (Android 工作室)import android.content.Intent;import android.app.IntentService;import org.opencv.core.Core;import org.opencv.core.Core.MinMaxLocResult;import org.opencv.core.CvType;import org.opencv.core.Mat;import org.opencv.core.Point;import org.opencv.core.Scalar;import org.opencv.imgcodecs.Imgcodecs;import org.opencv.imgproc.Imgproc;public class MyService extends IntentService {    public MyService() {        super("MyService");    }    @Override    protected void onHandleIntent(Intent workIntent) {        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);        Mat img = Imgcodecs.imread("/sdcard/Download/bigpicture.png");        Mat templ = Imgcodecs.imread("/sdcard/Download/template.png");        String outFile = "/sdcard/Download/result.png";        // Create the result matrix        int result_cols = img.cols() - templ.cols() + 1;        int result_rows = img.rows() - templ.rows() + 1;        Mat result = new Mat(result_rows, result_cols, CvType.CV_32FC1);        // Do the Matching Normalize and Perform the template matching operation        Imgproc.matchTemplate(img, templ, result, 3);        // Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());        Imgproc.threshold(result, result,0.98,1,Imgproc.THRESH_TOZERO);        // Localizing the best match with minMaxLoc. We localize the minimum and maximum values in the result matrix R by using minMaxLoc.        Point matchLoc;        Point maxLoc;        Point minLoc;    
查看完整描述

2 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

- 解决了 -


第一期


AndroidManifest.xml 需要这样的权限;


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

第 2 期


文件路径错误并更改;


Mat img = Imgcodecs.imread("/sdcard/Download/bigpicture.png");

Mat templ = Imgcodecs.imread("/sdcard/Download/template.png");

String outFile = "/sdcard/Download/result.png";


String path = Environment.getExternalStorageDirectory().getPath();


Mat img = Imgcodecs.imread(path + "/Download/bigpicture.png");

Mat templ = Imgcodecs.imread(path + "/Download/template.png");

String outFile = path + "/Download/result.png";

感谢您的关注和努力。


查看完整回答
反对 回复 2022-04-28
?
喵喔喔

TA贡献1735条经验 获得超5个赞

确保 matchTemplate() 的所有参数都具有正确的大小和类型。来自 OpenCV 文档:

image – 搜索运行的图像。它必须是 8 位或 32 位浮点数。

templ - 搜索的模板。它必须不大于源图像并且具有相同的数据类型。

所以请确保您的 roi 是类型(8 位或 32 位浮点)。还要检查您的图像是否正确打开,因为如果模板太小,它会给出该错误。


查看完整回答
反对 回复 2022-04-28
  • 2 回答
  • 0 关注
  • 208 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信