<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to OpenCV Migration</title><link>https://sourceforge.net/p/oculix/wiki/OpenCV%2520Migration/</link><description>Recent changes to OpenCV Migration</description><atom:link href="https://sourceforge.net/p/oculix/wiki/OpenCV%20Migration/feed" rel="self"/><language>en</language><lastBuildDate>Sun, 12 Apr 2026 00:55:56 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/oculix/wiki/OpenCV%20Migration/feed" rel="self" type="application/rss+xml"/><item><title>OpenCV Migration modified by Julien Mer</title><link>https://sourceforge.net/p/oculix/wiki/OpenCV%2520Migration/</link><description>&lt;div class="markdown_content"&gt;&lt;h1 id="h-opencv-migration-openpnp-to-apertix"&gt;OpenCV Migration: openpnp to Apertix&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Upgrade" rel="nofollow" src="https://img.shields.io/badge/type-upgrade-blue?style=for-the-badge"/&gt;&lt;br/&gt;
&lt;img alt="OpenCV 4.10.0" rel="nofollow" src="https://img.shields.io/badge/OpenCV-4.10.0-green?style=for-the-badge&amp;amp;logo=opencv"/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OculiX migrated from openpnp/opencv 4.5.4 (JNI) to Apertix 4.10.0-0 (JNA).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr/&gt;
&lt;h2 id="h-why-migrate"&gt;Why Migrate&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue with openpnp 4.5.4&lt;/th&gt;
&lt;th&gt;Resolution with Apertix 4.10.0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenCV 4.5.4 is outdated (2021)&lt;/td&gt;
&lt;td&gt;OpenCV 4.10.0 (2024)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JNI-based native loading (fragile)&lt;/td&gt;
&lt;td&gt;JNA-based (robust, cross-platform)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;System.loadLibrary&lt;/code&gt; conflicts&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nu.pattern.OpenCV.loadLocally()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No Apple Silicon support&lt;/td&gt;
&lt;td&gt;Apple Silicon via JNA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="h-what-is-apertix"&gt;What is Apertix&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/julienmerconsulting/Apertix" rel="nofollow"&gt;Apertix&lt;/a&gt; is a custom fork of openpnp/opencv by the OculiX maintainer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenCV 4.10.0 with JNA migration&lt;/li&gt;
&lt;li&gt;Packaging under &lt;code&gt;nu.pattern.OpenCV&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Published to Maven Central&lt;/li&gt;
&lt;li&gt;24 PRs of build infrastructure work&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h-maven-dependency"&gt;Maven Dependency&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cm"&gt;&amp;lt;!-- Before (SikuliX) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.openpnp&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;opencv&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;4.5.4&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

&lt;span class="cm"&gt;&amp;lt;!-- After (OculiX) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.github.julienmerconsulting.apertix&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;opencv&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;4.10.0-0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="h-loading-mechanism"&gt;Loading Mechanism&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Commons.loadOpenCV()&lt;/code&gt; uses a 3-stage fallback:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Stage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OpenCV&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loadLocally&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Apertix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;preferred&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fail&lt;/span&gt;
&lt;span class="n"&gt;Stage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loadLibrary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"opencv_java4100"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;library&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fail&lt;/span&gt;
&lt;span class="n"&gt;Stage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Extract&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DLL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JAR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;manual&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;extraction&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fail&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;└──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;libOpenCVloaded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;stays&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Critical fix (PR &lt;span&gt;&lt;span&gt;[#12]&lt;/span&gt;&lt;/span&gt;):&lt;/strong&gt; &lt;code&gt;libOpenCVloaded&lt;/code&gt; is only set to &lt;code&gt;true&lt;/code&gt; on actual success. Previously it was always &lt;code&gt;true&lt;/code&gt;, masking load failures.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="h-files-changed"&gt;Files Changed&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Core.java&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NATIVE_LIBRARY_NAME&lt;/code&gt;: &lt;code&gt;opencv_java454&lt;/code&gt; → &lt;code&gt;opencv_java4100&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Commons.java&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;loadOpenCV()&lt;/code&gt; rewritten with 3-stage fallback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sikulixcontent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Manifest aligned to &lt;code&gt;opencv_java4100&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;API/pom.xml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dependency changed to Apertix&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="h-impact"&gt;Impact&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Java 17 mandatory&lt;/strong&gt;: Apertix 4.10.0-0 is compiled with Java 17 (class file version 61.0)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JNA 5.14.0 required&lt;/strong&gt;: for glibc + Apple Silicon compatibility&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Julien Mer</dc:creator><pubDate>Sun, 12 Apr 2026 00:55:56 -0000</pubDate><guid>https://sourceforge.net9599c00e104944d5cf3fd908dea860e3808d72c3</guid></item></channel></rss>