Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 29 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,36 @@

## Unreleased
## 0.17.0 - 2026-09-12

### 🐛 Bug Fixes

- **fast_corners**: `detect` indexed its per-row candidate buffer inconsistently (written 1-based, read 0-based). It dropped each row's last corner and fed one uninitialised, pool-recycled cell into non-maximum suppression, which made its output depend on process history instead of on the image. It is now a pure function of its input and finds the corners that were being dropped. This is an intentional divergence from jsfeat, which has the same defect ([#202](https://github.com/webarkit/jsfeatNext/issues/202)).
- Index the per-row candidate buffer consistently (b065e4b)

- Replace fast_corners equality guards with #202-aware checks (009ee92)

- Make the GitHub Release step idempotent so same-tag retries work (ffd48c1)


### 📚 Documentation

- Record the fast_corners candidate-buffer divergence (9066abd)


### 📦 Build

- Bump vite-plugin-dts from 5.0.3 to 5.1.0 (d6ed987)


### 🧪 Testing

- Describe the same keypoints on both sides in the ORB test (7804f7e)

- Sweep seven scene seeds for the fast_corners superset relation (38fec73)


### 🧹 Miscellaneous

- Pin Node v24.20.0 in .nvmrc (92862d7)



## 0.16.0 - 2026-09-06
Expand Down
4 changes: 2 additions & 2 deletions dist/jsfeatNext.js

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions dist/jsfeatNext.mjs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*!
* jsfeatNext v0.16.0 — https://github.com/webarkit/jsfeatNext
* jsfeatNext v0.17.0 — https://github.com/webarkit/jsfeatNext
*
* SPDX-License-Identifier: LGPL-3.0-or-later
* Copyright 2026 WebARKit. Author(s): Walter Perdan @kalwalt
Expand Down Expand Up @@ -100,7 +100,7 @@ var e = new class {
S32C2_t: 514
}, a = {
name: "@webarkit/jsfeat-next",
version: "0.16.0",
version: "0.17.0",
description: "Typescript version of jsfeat for WebARKit",
main: "dist/jsfeatNext.js",
module: "dist/jsfeatNext.mjs",
Expand Down Expand Up @@ -967,13 +967,13 @@ var S = class extends c {
for (s = b; s < S; ++s, ++F) if (k = r[F], A = -k + 255, j = D[A + r[F + V]] | D[A + r[F + K]], j != 0 && (j &= D[A + r[F + H]] | D[A + r[F + J]], j &= D[A + r[F + W]] | D[A + r[F + X]], j &= D[A + r[F + te]] | D[A + r[F + Q]], j != 0)) {
if (j &= D[A + r[F + ee]] | D[A + r[F + q]], j &= D[A + r[F + U]] | D[A + r[F + Y]], j &= D[A + r[F + G]] | D[A + r[F + Z]], j &= D[A + r[F + ne]] | D[A + r[F + re]], j & 1) for (l = k - O, C = 0, c = 0; c < 25; ++c) if (u = r[F + g[c]], u < l) {
if (++C, C > 8) {
++M, h[N + M] = s, m[P + s] = E(r, F, g, _, O);
h[N + M] = s, ++M, m[P + s] = E(r, F, g, _, O);
break;
}
} else C = 0;
if (j & 2) for (l = k + O, C = 0, c = 0; c < 25; ++c) if (u = r[F + g[c]], u > l) {
if (++C, C > 8) {
++M, h[N + M] = s, m[P + s] = E(r, F, g, _, O);
h[N + M] = s, ++M, m[P + s] = E(r, F, g, _, O);
break;
}
} else C = 0;
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@webarkit/jsfeat-next",
"version": "0.16.0",
"version": "0.17.0",
"description": "Typescript version of jsfeat for WebARKit",
"main": "dist/jsfeatNext.js",
"module": "dist/jsfeatNext.mjs",
Expand Down
7 changes: 7 additions & 0 deletions types/src/fast_corners/fast_corners.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@ export declare class fast_corners extends jsfeatNext {
* suppression on the corner scores. Results are written into the
* pre-allocated `corners` array (each entry gets `x`, `y`, `score`).
*
* Diverges from jsfeat deliberately: jsfeat writes each row's candidate
* columns 1-based into the scratch buffer and reads them back 0-based, so
* one never-written (recycled, non-zeroed) cell per row feeds suppression
* and each row's last candidate is dropped. This writes and reads 0-based,
* which makes the result a pure function of the input and recovers those
* corners. See tests/divergences.test.ts and issue #202.
*
* @param src Source grayscale image (`U8C1`).
* @param corners Pre-allocated point pool to fill.
* @param border Pixels to skip along each edge (min 3). Default 3.
Expand Down