Android 中的 OpenCV 模板匹配示例

2023-11-26

我是 OpenCV 的初学者。我正在尝试制作一个示例 Android 应用程序,以使用 OpenCV 模板匹配来匹配给定图像中的模板图像。我在互联网上搜索,找不到合适的 android 或 java 代码来满足我的要求。但我有 C++ 代码。我不知道如何翻译它。http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html

你能帮我找到一个合适的java或android代码吗?或者请帮我将这个 C++ 代码翻译成 java,我可以在 android 应用程序中使用它。

先感谢您。

C++ code

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

/// Global Variables
Mat img; Mat templ; Mat result;
char* image_window = "Source Image";
char* result_window = "Result window";

int match_method;
int max_Trackbar = 5;

/// Function Headers
void MatchingMethod( int, void* );

/** @function main */
int main( int argc, char** argv )
{
  /// Load image and template
  img = imread( argv[1], 1 );
  templ = imread( argv[2], 1 );

  /// Create windows
  namedWindow( image_window, CV_WINDOW_AUTOSIZE );
  namedWindow( result_window, CV_WINDOW_AUTOSIZE );

  /// Create Trackbar
  char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";
  createTrackbar( trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod );

  MatchingMethod( 0, 0 );

  waitKey(0);
  return 0;
}

/**
 * @function MatchingMethod
 * @brief Trackbar callback
 */
void MatchingMethod( int, void* )
{
  /// Source image to display
  Mat img_display;
  img.copyTo( img_display );

  /// Create the result matrix
  int result_cols =  img.cols - templ.cols + 1;
  int result_rows = img.rows - templ.rows + 1;

  result.create( result_cols, result_rows, CV_32FC1 );

  /// Do the Matching and Normalize
  matchTemplate( img, templ, result, match_method );
  normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );

  /// Localizing the best match with minMaxLoc
  double minVal; double maxVal; Point minLoc; Point maxLoc;
  Point matchLoc;

  minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );

  /// For SQDIFF and SQDIFF_NORMED, the best matches are lower values. For all the other methods, the higher the better
  if( match_method  == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED )
    { matchLoc = minLoc; }
  else
    { matchLoc = maxLoc; }

  /// Show me what you got
  rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );
  rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );

  imshow( image_window, img_display );
  imshow( result_window, result );

  return;
}

我遇到了和你一样的问题。没有可用的 Java 源代码。后来在JavaDoc中搜索了一些关于const值的提示,我写了这个,这几乎是上面用Java编写的示例代码:

package opencv;

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.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

class MatchingDemo {
    public void run(String inFile, String templateFile, String outFile, int match_method) {
        System.out.println("\nRunning Template Matching");

        Mat img = Highgui.imread(inFile);
        Mat templ = Highgui.imread(templateFile);

        // / 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 and Normalize
        Imgproc.matchTemplate(img, templ, result, match_method);
        Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());

        // / Localizing the best match with minMaxLoc
        MinMaxLocResult mmr = Core.minMaxLoc(result);

        Point matchLoc;
        if (match_method == Imgproc.TM_SQDIFF || match_method == Imgproc.TM_SQDIFF_NORMED) {
            matchLoc = mmr.minLoc;
        } else {
            matchLoc = mmr.maxLoc;
        }

        // / Show me what you got
        Core.rectangle(img, matchLoc, new Point(matchLoc.x + templ.cols(),
                matchLoc.y + templ.rows()), new Scalar(0, 255, 0));

        // Save the visualized detection.
        System.out.println("Writing "+ outFile);
        Highgui.imwrite(outFile, img);

    }
}

public class TemplateMatching {
    public static void main(String[] args) {
        System.loadLibrary("opencv_java246");
        new MatchingDemo().run(args[0], args[1], args[2], Imgproc.TM_CCOEFF);
    }
}

现在,使用以下选项运行该程序:lena.png template.png templatematch.png你应该会得到和我一样的结果。确保您的运行时可以访问这些文件,当然,opencv 2.4.6 库已注册到您的类路径中。

lena.png template.png templatematch.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 中的 OpenCV 模板匹配示例 的相关文章

  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • 原子的 C++ 内存屏障

    在这方面我是个新手 谁能提供以下内存屏障之间差异的简化解释 窗户MemoryBarrier 围栏 mm mfence 内联汇编asm volatile memory 内在的 ReadWriteBarrier 如果没有简单的解释 一些好文章或
  • 重定向 std::cout

    我需要一个类 在其对象的生命周期内将一个 ostream 重定向到另一个 ostream 经过一番修补后 我想出了这个 include
  • Desire HD 中的应用程序崩溃

    由于某些莫名其妙的原因 我的应用程序在 HTC Desire HD 上崩溃了 它在其他手机和模拟器中运行良好 这是崩溃报告 java lang RuntimeException Unable to start activity Compon
  • 如何更改 JAX-WS Web 服务的地址位置

    我们目前已经公开了具有以下 URL 的 JAX RPC Web 服务 http xx xx xx xx myservice MYGatewaySoapHttpPort wsdl http xx xx xx xx myservice MYGa
  • List 或其他类型上的 string.Join

    我想将整数数组或列表转换为逗号分隔的字符串 如下所示 string myFunction List
  • Spring MVC:通用 DAO 和服务类

    我正在 Spring MVC 中编写网页 我使用 Generic DAO 编写了所有 DAO 现在我想重写我的服务类 我该如何写 通用服务 我的 DAO 如下 DAO package net example com dao import j
  • ebean 映射到 BYTEA 的数据类型是什么?

    我有一个游戏 2 0 2 需要在数据库中存储一些文件的应用程序 我们使用 Ebean 作为 ORM 我相信我的数据库中需要一个 BYTEA 列来存储该文件 但我不确定在我的模型中使用什么数据类型 我应该使用某种Blob 或者只是一个byte
  • 用于生成 ISO 文件的 Maven 插件

    有没有可以生成ISO镜像的maven插件 我需要获取一些模块的输出 主要是包含 jar 的 zip 文件 并将它们组合成一个 ISO 映像 Thanks 现在有一个 ISO9660 maven 插件可以完成这项工作 https github
  • 如何在 SQLite 中检查数据库是否存在 C#

    我目前正在用 C 编写一个应用程序 并使用 sqlite 作为嵌入式数据库 我的应用程序在启动时创建一个新数据库 但如何让它检查数据库是否存在 如果它确实存在 我如何让它使用它 如果不存在如何创建一个新数据库 这是我到目前为止所拥有的 pr
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的
  • 使用 Android O 的“android:fontFamily”时出现错误“文件名必须以 .xml 结尾”?

    Android O 引入了一项新功能 XML 中的字体 它允许您将字体用作资源 我正在创建font资源文件中的文件夹 由安卓开发者 https developer android com preview features working w
  • 使用 WinAPI 连接禁用的显示设备

    我的问题是启用禁用的监视器ChangeDisplaySettingsEx 我想这不是火箭科学 但经过一番挖掘后 它看起来仍然是不可能的 我找到了一种根据找到的 Microsoft 代码示例禁用所有辅助显示器的方法here https msd
  • Android IntentService无法实例化类;没有空构造函数

    我有一个MainActivity需要访问在线 API 从而使用网络资源 的类 这需要我在单独的文件中创建的后台线程HttpRequestService java MainActivity java public class MainActi
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • FragmentMap + ActionBar 选项卡

    我一直在尝试插入一个MapView进入一个ActionBar Tab 但我什至无法解决问题 即使谷歌搜索 这是主要活动 Override public void onCreate Bundle savedInstanceState supe
  • JPA ManyToMany 产生的空联接表

    我有一个应用程序 其中我尝试使用 Hibernate 作为 JPA 提供程序来实现两个实体之间的多对多关系 我正在尝试的例子是一个单向的 其中一个相机可以有多个镜头 而镜头可以安装到多个相机中 以下是我的实体类 只需粘贴其中的相关部分 Ca
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码
  • Android:通过查找带有标签而不是 ID 的容器来添加片段

    我正在使用 for 循环创建片段的多个实例 在每个片段中 我需要添加另一组子片段 为此 我需要找到正确的容器 如果我使用容器的 ID 所有子片段都会添加到第一个父片段 而不是它们自己的父片段 在我的主要片段中 for ParentFragm

随机推荐

  • 如何将整个流读入 std::vector ?

    I read 这里有一个答案展示如何使用以下一 两 行将整个流读入 std string std istreambuf iterator
  • 带有护照 jwt 的非对称密钥。验证始终返回未经授权

    正在开发一个应用程序 我从一开始就希望安全 所以我创建了一个私钥 公钥对 并且正在设置passport jwt像这样 key是密钥对的公共部分 passport key gt const opts jwtFromRequest Extrac
  • 在 Apps 脚本中取消 gzipping Blob 时出现“无效参数”错误

    我有一个脚本 可以从第 3 方 API 接收 gzipped blob 我正在尝试使用它来解压它Utilities ungzip 但出现无效参数错误 这是示例代码 var liveReportResponse UrlFetchApp fet
  • 将 Mongoose 文档转换为 json

    我以这种方式将 mongoose 文档作为 json 返回 UserModel find function err users return res end JSON stringify users 但是 user proto 也被返回 没
  • Maven:如何避免版本附加到 Maven 中的 war 文件?

    我使用 Maven 作为构建文件 这是我对要生成的 war 文件名的以下设置 我使用的是 Maven 版本 2 2 1
  • NVarchar、Bin 排序规则、Bin2 排序规则之间有什么区别?

    所有 3 个选项均区分大小写和重音 并支持 Unicode 根据文档 NVarchar 根据 相关语言或字母表的词典 对数据进行排序和比较 Bin 根据 位模式 对数据进行排序和比较 Bin2 根据 Unicode 数据的 Unicode
  • 将 Spring bean 注入 EJB3

    我正在尝试使用以下方法将 Spring beans 注入到 EJB 中 Interceptors SpringBeanAutowiringInterceptor class 但我无法让它与beanRefContext xml我见过的例子 这
  • 如何在 ggplot2 中按时间顺序排列月份而不是写出月份?

    我正在尝试绘制计数与月份的关系图 ggplot dat aes x month y count group region geom line data mcount mcount region West coast colour black
  • AWS Cognito - 从 ADFS 创建组作为 Cognito 组

    应用程序通过 Open ID Connect 协议与AWS认知 它连接到ADFS 通过 SAML 进行通信 Cognito 本质上是 代理 ADFS 服务器 ADFS 持有组映射应用程序需要的 我想将这些组作为实际的 Cognito 组导入
  • C++11 以字符串形式获取当前日期和时间

    在 C 11 中以字符串形式获取日期和时间的最先进方法是什么 我知道关于std put time 但参考文献说我只能在流中使用它 有std chrono system clock它提供了to time t返回时间为time t而且缺少日期
  • Laravel - 擦除包含特定字符串的所有缓存/redis 键

    是否可以使用 Laravel 删除 Redis 中与特定字符串匹配的所有键 例如 如果我想忘记具有单词 products 的键 它会忘记以下键 laravel 896235872385237588327582370375acaca23532
  • 字符串中的“\n”不起作用

    我有一小段适合我的操作系统的代码 print Type your document below print Press enter to save print Type n for a new line file input print E
  • Powershell New-PSSession 访问被拒绝 - 管理员帐户

    我尝试使用 powershell PSSession cmdlet 但我遇到了访问被拒绝错误 我尝试做的是使用管理员帐户运行命令New PSSession or Enter PSSession 不幸的是我收到访问被拒绝错误 我相信我正确地遵
  • 将值设置为 jquery 自动完成组合框

    我在用jquery 自动完成组合框一切都很好 但我也想通过 JavaScript 设置特定值 例如 value val somevalue 它设置为选择元素 但自动完成功能的输入元素没有变化 当然 我可以直接选择这个输入并设置值 但是还有其
  • Clojure 传感器是否急切?

    在这篇博客文章中 JavaScript 中的 CSP 和转换器 作者指出 首先 我们必须认识到许多数组 或其他集合 操作 例如map filter and reverse可以定义为reduce So 然后我们看到Clojure 中的许多实现
  • Windows 8 应用程序上的全局应用程序栏

    我正在开发一个 Windows 8 应用程序项目 我使用的是 Visual Studio 2012 它是预定义的模板 GroupedPage SplitPage ItemsPage 这时候我需要添加一个App栏 我选择的方式是创建一个并将其
  • Polyfill 或 ECMAScript5 新功能的解决方法?

    我想用新的来编写我的JS代码ECMAScript5 特性今天和未来都有效 由于并非所有浏览器都支持所有功能 尤其是 IE 例如Object create Array isArray or JSON 我知道一些解决方法 例如使用json2 j
  • 尝试获取 ImageView 中图像的显示尺寸

    我正在尝试获取图像视图中显示的图像的实际大小 实际上我的图像比屏幕大 图像视图正在调整图像大小以显示它 我正在寻找这个新尺寸 我试图在自定义视图中重写 ImageView 的 onDraw 方法 但我没有得到正确的高度和宽度 public
  • 如何在 C# 中解码 HTML 字符?

    我有用 HTML 字符实体编码的电子邮件地址 NET 中有什么可以将它们转换为纯字符串吗 您可以使用HttpUtility HtmlDecode 如果您使用 NET 4 0 您还可以使用WebUtility HtmlDecode它不需要额外
  • Android 中的 OpenCV 模板匹配示例

    我是 OpenCV 的初学者 我正在尝试制作一个示例 Android 应用程序 以使用 OpenCV 模板匹配来匹配给定图像中的模板图像 我在互联网上搜索 找不到合适的 android 或 java 代码来满足我的要求 但我有 C 代码 我