[INFO] fetching crate yscv-imgproc 0.1.11...
[INFO] documenting yscv-imgproc-0.1.11 against da3f5c31e5535b3dc210067de660a45784ae1e9c for pr-162169
[INFO] extracting crate yscv-imgproc 0.1.11 into /workspace/builds/worker-6-tc2/source
[INFO] started tweaking crates.io crate yscv-imgproc 0.1.11
[INFO] finished tweaking crates.io crate yscv-imgproc 0.1.11
[INFO] tweaked toml for crates.io crate yscv-imgproc 0.1.11 written to /workspace/builds/worker-6-tc2/source/Cargo.toml
[INFO] validating manifest of crates.io crate yscv-imgproc 0.1.11 on toolchain da3f5c31e5535b3dc210067de660a45784ae1e9c
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+da3f5c31e5535b3dc210067de660a45784ae1e9c" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate crates.io crate yscv-imgproc 0.1.11 already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+da3f5c31e5535b3dc210067de660a45784ae1e9c" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:8683fc1fc2eb5c9ac98e0d076ab094b2ffac7f99da555d2b6a2e27f346de2ec7" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] 2146229a75751cf09c841bada97bb88246ed4054735c1f21aa85755510dd291c
[INFO] running `Command { std: "docker" "start" "2146229a75751cf09c841bada97bb88246ed4054735c1f21aa85755510dd291c", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "2146229a75751cf09c841bada97bb88246ed4054735c1f21aa85755510dd291c", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "2146229a75751cf09c841bada97bb88246ed4054735c1f21aa85755510dd291c" "/opt/rustwide/cargo-home/bin/cargo" "+da3f5c31e5535b3dc210067de660a45784ae1e9c" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "2146229a75751cf09c841bada97bb88246ed4054735c1f21aa85755510dd291c", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-w" "/opt/rustwide/workdir" "--user" "0:0" "2146229a75751cf09c841bada97bb88246ed4054735c1f21aa85755510dd291c" "/opt/rustwide/cargo-home/bin/cargo" "+da3f5c31e5535b3dc210067de660a45784ae1e9c" "doc" "--frozen" "--no-deps" "--document-private-items" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling yscv-tensor v0.1.11
[INFO] [stderr]     Checking flate2 v1.1.9
[INFO] [stderr]     Checking pxfm v0.1.28
[INFO] [stderr]     Checking zune-jpeg v0.5.13
[INFO] [stderr]     Checking bytemuck v1.25.0
[INFO] [stderr]     Checking yscv-cpu v0.1.11
[INFO] [stderr]     Checking png v0.18.1
[INFO] [stderr]     Checking moxcms v0.8.1
[INFO] [stderr]     Checking image v0.25.10
[INFO] [stderr]  Documenting yscv-imgproc v0.1.11 (/opt/rustwide/workdir)
[INFO] [stdout] warning: unresolved link to `0,1`
[INFO] [stdout]    --> src/ops/color.rs:719:43
[INFO] [stdout]     |
[INFO] [stdout] 719 | /// Fast sRGB → linear for f32 values in [0,1] using the 256-entry LUT with linear interpolation.
[INFO] [stdout]     |                                           ^^^ no item named `0,1` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout]     = note: `#[warn(rustdoc::broken_intra_doc_links)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `i`
[INFO] [stdout]    --> src/ops/features.rs:183:9
[INFO] [stdout]     |
[INFO] [stdout] 183 | /// acc[i] += src[i] for all i, NEON-accelerated on aarch64.
[INFO] [stdout]     |         ^ no item named `i` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `i`
[INFO] [stdout]    --> src/ops/features.rs:183:19
[INFO] [stdout]     |
[INFO] [stdout] 183 | /// acc[i] += src[i] for all i, NEON-accelerated on aarch64.
[INFO] [stdout]     |                   ^ no item named `i` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `i`
[INFO] [stdout]    --> src/ops/features.rs:233:9
[INFO] [stdout]     |
[INFO] [stdout] 233 | /// acc[i] -= src[i] for all i, NEON-accelerated on aarch64.
[INFO] [stdout]     |         ^ no item named `i` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `i`
[INFO] [stdout]    --> src/ops/features.rs:233:19
[INFO] [stdout]     |
[INFO] [stdout] 233 | /// acc[i] -= src[i] for all i, NEON-accelerated on aarch64.
[INFO] [stdout]     |                   ^ no item named `i` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `x`
[INFO] [stdout]    --> src/ops/features.rs:839:45
[INFO] [stdout]     |
[INFO] [stdout] 839 | /// SIMD-accelerated vertical min step: cur[x] = min(cur[x], src[x] + 1) for all x.
[INFO] [stdout]     |                                             ^ no item named `x` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `x`
[INFO] [stdout]    --> src/ops/features.rs:839:58
[INFO] [stdout]     |
[INFO] [stdout] 839 | /// SIMD-accelerated vertical min step: cur[x] = min(cur[x], src[x] + 1) for all x.
[INFO] [stdout]     |                                                          ^ no item named `x` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `x`
[INFO] [stdout]    --> src/ops/features.rs:839:66
[INFO] [stdout]     |
[INFO] [stdout] 839 | /// SIMD-accelerated vertical min step: cur[x] = min(cur[x], src[x] + 1) for all x.
[INFO] [stdout]     |                                                                  ^ no item named `x` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `i`
[INFO] [stdout]    --> src/ops/geometry.rs:392:25
[INFO] [stdout]     |
[INFO] [stdout] 392 | /// SIMD magnitude: out[i] = sqrt(gx[i]² + gy[i]²). Returns count processed.
[INFO] [stdout]     |                         ^ no item named `i` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `i`
[INFO] [stdout]    --> src/ops/geometry.rs:392:38
[INFO] [stdout]     |
[INFO] [stdout] 392 | /// SIMD magnitude: out[i] = sqrt(gx[i]² + gy[i]²). Returns count processed.
[INFO] [stdout]     |                                      ^ no item named `i` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unresolved link to `i`
[INFO] [stdout]    --> src/ops/geometry.rs:392:47
[INFO] [stdout]     |
[INFO] [stdout] 392 | /// SIMD magnitude: out[i] = sqrt(gx[i]² + gy[i]²). Returns count processed.
[INFO] [stdout]     |                                               ^ no item named `i` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/nms.rs:8:1
[INFO] [stdout]    |
[INFO] [stdout]  8 | / pub struct BBox {
[INFO] [stdout]  9 | |     pub x1: f32,
[INFO] [stdout] 10 | |     pub y1: f32,
[INFO] [stdout] 11 | |     pub x2: f32,
[INFO] [stdout] 12 | |     pub y2: f32,
[INFO] [stdout] 13 | |     pub score: f32,
[INFO] [stdout] 14 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Axis-aligned bounding box.`
[INFO] [stdout]    = help: ends near `Bounding box with confidence for NMS.`
[INFO] [stdout]    = note: `#[deny(rustdoc::unportable_markdown)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/nms.rs:8:1
[INFO] [stdout]    |
[INFO] [stdout]  8 | / pub struct BBox {
[INFO] [stdout]  9 | |     pub x1: f32,
[INFO] [stdout] 10 | |     pub y1: f32,
[INFO] [stdout] 11 | |     pub x2: f32,
[INFO] [stdout] 12 | |     pub y2: f32,
[INFO] [stdout] 13 | |     pub score: f32,
[INFO] [stdout] 14 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Bounding box with confidence for NMS.`
[INFO] [stdout]    = help: ends near `Bounding box with confidence for NMS.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/brief.rs:9:1
[INFO] [stdout]    |
[INFO] [stdout]  9 | / pub struct BriefDescriptor {
[INFO] [stdout] 10 | |     pub bits: [u8; 32],
[INFO] [stdout] 11 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `256-bit BRIEF binary descriptor.`
[INFO] [stdout]    = help: ends near `BRIEF descriptor: 256-bit binary descriptor stored as 32 bytes.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/brief.rs:9:1
[INFO] [stdout]    |
[INFO] [stdout]  9 | / pub struct BriefDescriptor {
[INFO] [stdout] 10 | |     pub bits: [u8; 32],
[INFO] [stdout] 11 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `BRIEF descriptor: 256-bit binary descriptor stored as 32 bytes.`
[INFO] [stdout]    = help: ends near `BRIEF descriptor: 256-bit binary descriptor stored as 32 bytes.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/calibration.rs:3:1
[INFO] [stdout]    |
[INFO] [stdout]  3 | / pub struct CameraIntrinsics {
[INFO] [stdout]  4 | |     /// Focal length in x (pixels).
[INFO] [stdout]  5 | |     pub fx: f32,
[INFO] [stdout]  6 | |     /// Focal length in y (pixels).
[INFO] [stdout] ...  |
[INFO] [stdout] 19 | |     pub p2: f32,
[INFO] [stdout] 20 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Camera intrinsic parameters (fx, fy, cx, cy, distortion coefficients).`
[INFO] [stdout]    = help: ends near `Camera intrinsic parameters including radial and tangential distortion coefficients.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/calibration.rs:3:1
[INFO] [stdout]    |
[INFO] [stdout]  3 | / pub struct CameraIntrinsics {
[INFO] [stdout]  4 | |     /// Focal length in x (pixels).
[INFO] [stdout]  5 | |     pub fx: f32,
[INFO] [stdout]  6 | |     /// Focal length in y (pixels).
[INFO] [stdout] ...  |
[INFO] [stdout] 19 | |     pub p2: f32,
[INFO] [stdout] 20 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Camera intrinsic parameters including radial and tangential distortion coefficients.`
[INFO] [stdout]    = help: ends near `Camera intrinsic parameters including radial and tangential distortion coefficients.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/threshold.rs:680:1
[INFO] [stdout]     |
[INFO] [stdout] 680 | / pub struct CannyScratch {
[INFO] [stdout] 681 | |     magnitude: Vec<f32>,
[INFO] [stdout] 682 | |     direction: Vec<u8>,
[INFO] [stdout] 683 | |     nms: Vec<f32>,
[INFO] [stdout] 684 | |     edges: Vec<u8>,
[INFO] [stdout] 685 | |     queue: Vec<usize>,
[INFO] [stdout] 686 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Pre-allocated scratch buffers for [`canny_with_scratch`].`
[INFO] [stdout]     = help: ends near `Canny edge detection on a single-channel HWC image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/threshold.rs:680:1
[INFO] [stdout]     |
[INFO] [stdout] 680 | / pub struct CannyScratch {
[INFO] [stdout] 681 | |     magnitude: Vec<f32>,
[INFO] [stdout] 682 | |     direction: Vec<u8>,
[INFO] [stdout] 683 | |     nms: Vec<f32>,
[INFO] [stdout] 684 | |     edges: Vec<u8>,
[INFO] [stdout] 685 | |     queue: Vec<usize>,
[INFO] [stdout] 686 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Canny edge detection on a single-channel HWC image.`
[INFO] [stdout]     = help: ends near `Canny edge detection on a single-channel HWC image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:549:1
[INFO] [stdout]     |
[INFO] [stdout] 549 | / pub struct ComponentStats {
[INFO] [stdout] 550 | |     pub label: usize,
[INFO] [stdout] 551 | |     pub area: usize,
[INFO] [stdout] 552 | |     pub bbox: (usize, usize, usize, usize), // (x, y, w, h)
[INFO] [stdout] 553 | |     pub centroid: (f32, f32),               // (cx, cy)
[INFO] [stdout] 554 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Statistics for a connected component region.`
[INFO] [stdout]     = help: ends near `Statistics for a single connected component.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:549:1
[INFO] [stdout]     |
[INFO] [stdout] 549 | / pub struct ComponentStats {
[INFO] [stdout] 550 | |     pub label: usize,
[INFO] [stdout] 551 | |     pub area: usize,
[INFO] [stdout] 552 | |     pub bbox: (usize, usize, usize, usize), // (x, y, w, h)
[INFO] [stdout] 553 | |     pub centroid: (f32, f32),               // (cx, cy)
[INFO] [stdout] 554 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Statistics for a single connected component.`
[INFO] [stdout]     = help: ends near `Statistics for a single connected component.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/contours.rs:8:1
[INFO] [stdout]    |
[INFO] [stdout]  8 | / pub struct Contour {
[INFO] [stdout]  9 | |     pub points: Vec<(usize, usize)>,
[INFO] [stdout] 10 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Contour represented as a sequence of (row, col) points.`
[INFO] [stdout]    = help: ends near `A contour as an ordered list of (x, y) boundary pixel coordinates.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/contours.rs:8:1
[INFO] [stdout]    |
[INFO] [stdout]  8 | / pub struct Contour {
[INFO] [stdout]  9 | |     pub points: Vec<(usize, usize)>,
[INFO] [stdout] 10 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `A contour as an ordered list of (x, y) boundary pixel coordinates.`
[INFO] [stdout]    = help: ends near `A contour as an ordered list of (x, y) boundary pixel coordinates.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/flow.rs:10:1
[INFO] [stdout]    |
[INFO] [stdout] 10 | / pub struct FarnebackConfig {
[INFO] [stdout] 11 | |     /// Pyramid scale (< 1.0, default 0.5).
[INFO] [stdout] 12 | |     pub pyr_scale: f32,
[INFO] [stdout] 13 | |     /// Number of pyramid levels (default 3).
[INFO] [stdout] ...  |
[INFO] [stdout] 22 | |     pub poly_sigma: f32,
[INFO] [stdout] 23 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Configuration for Farneback dense optical flow.`
[INFO] [stdout]    = help: ends near `Configuration for Farneback dense optical flow.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/features.rs:17:1
[INFO] [stdout]    |
[INFO] [stdout] 17 | / pub struct HarrisKeypoint {
[INFO] [stdout] 18 | |     pub x: usize,
[INFO] [stdout] 19 | |     pub y: usize,
[INFO] [stdout] 20 | |     pub response: f32,
[INFO] [stdout] 21 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Harris corner keypoint with location and response strength.`
[INFO] [stdout]    = help: ends near `Detected corner/interest point.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/features.rs:17:1
[INFO] [stdout]    |
[INFO] [stdout] 17 | / pub struct HarrisKeypoint {
[INFO] [stdout] 18 | |     pub x: usize,
[INFO] [stdout] 19 | |     pub y: usize,
[INFO] [stdout] 20 | |     pub response: f32,
[INFO] [stdout] 21 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Detected corner/interest point.`
[INFO] [stdout]    = help: ends near `Detected corner/interest point.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/features.rs:610:1
[INFO] [stdout]     |
[INFO] [stdout] 610 | / pub struct HoughLine {
[INFO] [stdout] 611 | |     pub rho: f32,
[INFO] [stdout] 612 | |     pub theta: f32,
[INFO] [stdout] 613 | |     pub votes: u32,
[INFO] [stdout] 614 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Hough line in (rho, theta) form.`
[INFO] [stdout]     = help: ends near `Detected line in Hough parameter space.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/features.rs:610:1
[INFO] [stdout]     |
[INFO] [stdout] 610 | / pub struct HoughLine {
[INFO] [stdout] 611 | |     pub rho: f32,
[INFO] [stdout] 612 | |     pub theta: f32,
[INFO] [stdout] 613 | |     pub votes: u32,
[INFO] [stdout] 614 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Detected line in Hough parameter space.`
[INFO] [stdout]     = help: ends near `Detected line in Hough parameter space.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/fast.rs:16:1
[INFO] [stdout]    |
[INFO] [stdout] 16 | / pub struct Keypoint {
[INFO] [stdout] 17 | |     pub x: f32,
[INFO] [stdout] 18 | |     pub y: f32,
[INFO] [stdout] 19 | |     pub response: f32,
[INFO] [stdout] 20 | |     pub angle: f32,
[INFO] [stdout] 21 | |     pub octave: usize,
[INFO] [stdout] 22 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Detected keypoint with location, response, and scale.`
[INFO] [stdout]    = help: ends near `A detected keypoint with orientation and scale information.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/fast.rs:16:1
[INFO] [stdout]    |
[INFO] [stdout] 16 | / pub struct Keypoint {
[INFO] [stdout] 17 | |     pub x: f32,
[INFO] [stdout] 18 | |     pub y: f32,
[INFO] [stdout] 19 | |     pub response: f32,
[INFO] [stdout] 20 | |     pub angle: f32,
[INFO] [stdout] 21 | |     pub octave: usize,
[INFO] [stdout] 22 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `A detected keypoint with orientation and scale information.`
[INFO] [stdout]    = help: ends near `A detected keypoint with orientation and scale information.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/orb.rs:17:1
[INFO] [stdout]    |
[INFO] [stdout] 17 | / pub struct OrbConfig {
[INFO] [stdout] 18 | |     /// Maximum number of features to retain (default 500).
[INFO] [stdout] 19 | |     pub num_features: usize,
[INFO] [stdout] 20 | |     /// Scale factor between pyramid levels (default 1.2).
[INFO] [stdout] ...  |
[INFO] [stdout] 25 | |     pub fast_threshold: f32,
[INFO] [stdout] 26 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Configuration for ORB feature detector.`
[INFO] [stdout]    = help: ends near `Configuration for the ORB feature detector.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/orb.rs:17:1
[INFO] [stdout]    |
[INFO] [stdout] 17 | / pub struct OrbConfig {
[INFO] [stdout] 18 | |     /// Maximum number of features to retain (default 500).
[INFO] [stdout] 19 | |     pub num_features: usize,
[INFO] [stdout] 20 | |     /// Scale factor between pyramid levels (default 1.2).
[INFO] [stdout] ...  |
[INFO] [stdout] 25 | |     pub fast_threshold: f32,
[INFO] [stdout] 26 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Configuration for the ORB feature detector.`
[INFO] [stdout]    = help: ends near `Configuration for the ORB feature detector.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1602:1
[INFO] [stdout]      |
[INFO] [stdout] 1602 | / pub struct OrbDescriptor {
[INFO] [stdout] 1603 | |     pub keypoint: (usize, usize),
[INFO] [stdout] 1604 | |     pub bits: [u8; 32],
[INFO] [stdout] 1605 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `ORB binary descriptor (256-bit).`
[INFO] [stdout]      = help: ends near `ORB descriptor: 256-bit binary descriptor stored as 32 bytes.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1602:1
[INFO] [stdout]      |
[INFO] [stdout] 1602 | / pub struct OrbDescriptor {
[INFO] [stdout] 1603 | |     pub keypoint: (usize, usize),
[INFO] [stdout] 1604 | |     pub bits: [u8; 32],
[INFO] [stdout] 1605 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `ORB descriptor: 256-bit binary descriptor stored as 32 bytes.`
[INFO] [stdout]      = help: ends near `ORB descriptor: 256-bit binary descriptor stored as 32 bytes.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/orb.rs:10:1
[INFO] [stdout]    |
[INFO] [stdout] 10 | / pub struct OrbFeature {
[INFO] [stdout] 11 | |     pub keypoint: Keypoint,
[INFO] [stdout] 12 | |     pub descriptor: BriefDescriptor,
[INFO] [stdout] 13 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Combined ORB keypoint + descriptor.`
[INFO] [stdout]    = help: ends near `ORB feature: oriented FAST keypoint paired with a rotated BRIEF descriptor.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/orb.rs:10:1
[INFO] [stdout]    |
[INFO] [stdout] 10 | / pub struct OrbFeature {
[INFO] [stdout] 11 | |     pub keypoint: Keypoint,
[INFO] [stdout] 12 | |     pub descriptor: BriefDescriptor,
[INFO] [stdout] 13 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `ORB feature: oriented FAST keypoint paired with a rotated BRIEF descriptor.`
[INFO] [stdout]    = help: ends near `ORB feature: oriented FAST keypoint paired with a rotated BRIEF descriptor.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:558:1
[INFO] [stdout]     |
[INFO] [stdout] 558 | / pub struct RegionProp {
[INFO] [stdout] 559 | |     pub label: usize,
[INFO] [stdout] 560 | |     pub area: usize,
[INFO] [stdout] 561 | |     pub centroid: (f32, f32),
[INFO] [stdout] 562 | |     pub bbox: (usize, usize, usize, usize), // (x, y, w, h)
[INFO] [stdout] 563 | |     pub perimeter: f32,
[INFO] [stdout] 564 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Properties of a labeled image region.`
[INFO] [stdout]     = help: ends near `Properties for a labelled region.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:558:1
[INFO] [stdout]     |
[INFO] [stdout] 558 | / pub struct RegionProp {
[INFO] [stdout] 559 | |     pub label: usize,
[INFO] [stdout] 560 | |     pub area: usize,
[INFO] [stdout] 561 | |     pub centroid: (f32, f32),
[INFO] [stdout] 562 | |     pub bbox: (usize, usize, usize, usize), // (x, y, w, h)
[INFO] [stdout] 563 | |     pub perimeter: f32,
[INFO] [stdout] 564 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Properties for a labelled region.`
[INFO] [stdout]     = help: ends near `Properties for a labelled region.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/stereo.rs:8:1
[INFO] [stdout]    |
[INFO] [stdout]  8 | / pub struct StereoConfig {
[INFO] [stdout]  9 | |     /// Number of disparity levels to search (must be > 0).
[INFO] [stdout] 10 | |     pub num_disparities: usize,
[INFO] [stdout] 11 | |     /// Side length of the matching block (must be odd and > 0).
[INFO] [stdout] ...  |
[INFO] [stdout] 14 | |     pub min_disparity: usize,
[INFO] [stdout] 15 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Configuration for stereo block matching.`
[INFO] [stdout]    = help: ends near `Configuration for stereo block matching.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/surf.rs:18:1
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub type SurfDescriptor = Vec<f32>;
[INFO] [stdout]    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `SURF descriptor.`
[INFO] [stdout]    = help: ends near `SURF descriptor (64-element vector).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/surf.rs:18:1
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub type SurfDescriptor = Vec<f32>;
[INFO] [stdout]    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `SURF descriptor (64-element vector).`
[INFO] [stdout]    = help: ends near `SURF descriptor (64-element vector).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/surf.rs:8:1
[INFO] [stdout]    |
[INFO] [stdout]  8 | / pub struct SurfKeypoint {
[INFO] [stdout]  9 | |     pub x: f32,
[INFO] [stdout] 10 | |     pub y: f32,
[INFO] [stdout] 11 | |     pub scale: f32,
[INFO] [stdout] ...  |
[INFO] [stdout] 14 | |     pub laplacian_sign: i8, // +1 or -1
[INFO] [stdout] 15 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `SURF keypoint.`
[INFO] [stdout]    = help: ends near `SURF keypoint with position, scale, orientation, and response.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/surf.rs:8:1
[INFO] [stdout]    |
[INFO] [stdout]  8 | / pub struct SurfKeypoint {
[INFO] [stdout]  9 | |     pub x: f32,
[INFO] [stdout] 10 | |     pub y: f32,
[INFO] [stdout] 11 | |     pub scale: f32,
[INFO] [stdout] ...  |
[INFO] [stdout] 14 | |     pub laplacian_sign: i8, // +1 or -1
[INFO] [stdout] 15 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `SURF keypoint with position, scale, orientation, and response.`
[INFO] [stdout]    = help: ends near `SURF keypoint with position, scale, orientation, and response.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/nms.rs:63:1
[INFO] [stdout]    |
[INFO] [stdout] 63 | / pub enum TemplateMatchMethod {
[INFO] [stdout] 64 | |     /// Sum of squared differences (lower = better match).
[INFO] [stdout] 65 | |     Ssd,
[INFO] [stdout] 66 | |     /// Normalized cross-correlation (higher = better match).
[INFO] [stdout] 67 | |     Ncc,
[INFO] [stdout] 68 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Method selection for template matching.`
[INFO] [stdout]    = help: ends near `Template matching method.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/nms.rs:63:1
[INFO] [stdout]    |
[INFO] [stdout] 63 | / pub enum TemplateMatchMethod {
[INFO] [stdout] 64 | |     /// Sum of squared differences (lower = better match).
[INFO] [stdout] 65 | |     Ssd,
[INFO] [stdout] 66 | |     /// Normalized cross-correlation (higher = better match).
[INFO] [stdout] 67 | |     Ncc,
[INFO] [stdout] 68 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Template matching method.`
[INFO] [stdout]    = help: ends near `Template matching method.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/nms.rs:72:1
[INFO] [stdout]    |
[INFO] [stdout] 72 | / pub struct TemplateMatchResult {
[INFO] [stdout] 73 | |     pub x: usize,
[INFO] [stdout] 74 | |     pub y: usize,
[INFO] [stdout] 75 | |     pub score: f32,
[INFO] [stdout] 76 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Result of template matching (location + score).`
[INFO] [stdout]    = help: ends near `Template matching result: top-left location and score.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/nms.rs:72:1
[INFO] [stdout]    |
[INFO] [stdout] 72 | / pub struct TemplateMatchResult {
[INFO] [stdout] 73 | |     pub x: usize,
[INFO] [stdout] 74 | |     pub y: usize,
[INFO] [stdout] 75 | |     pub score: f32,
[INFO] [stdout] 76 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Template matching result: top-left location and score.`
[INFO] [stdout]    = help: ends near `Template matching result: top-left location and score.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/features.rs:931:1
[INFO] [stdout]     |
[INFO] [stdout] 931 | / pub enum DistanceTransformMask {
[INFO] [stdout] 932 | |     /// 3×3 chamfer mask (`DIST_L2`, `maskSize = 3`): a = 0.955, b = 1.3693.
[INFO] [stdout] 933 | |     Mask3,
[INFO] [stdout] 934 | |     /// 5×5 chamfer mask with knight moves (`maskSize = 5`):
[INFO] [stdout] 935 | |     /// a = 1.0, b = 1.4, c = 2.1969.
[INFO] [stdout] 936 | |     Mask5,
[INFO] [stdout] 937 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Euclidean distance transform. Input: `[H, W]` binary f32.`
[INFO] [stdout]     = help: ends near `Mask size for [`distance_transform_l2`], matching OpenCV's `maskSize`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/features.rs:931:1
[INFO] [stdout]     |
[INFO] [stdout] 931 | / pub enum DistanceTransformMask {
[INFO] [stdout] 932 | |     /// 3×3 chamfer mask (`DIST_L2`, `maskSize = 3`): a = 0.955, b = 1.3693.
[INFO] [stdout] 933 | |     Mask3,
[INFO] [stdout] 934 | |     /// 5×5 chamfer mask with knight moves (`maskSize = 5`):
[INFO] [stdout] 935 | |     /// a = 1.0, b = 1.4, c = 2.1969.
[INFO] [stdout] 936 | |     Mask5,
[INFO] [stdout] 937 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Mask size for [`distance_transform_l2`], matching OpenCV's `maskSize`.`
[INFO] [stdout]     = help: ends near `Mask size for [`distance_transform_l2`], matching OpenCV's `maskSize`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/threshold.rs:914:1
[INFO] [stdout]     |
[INFO] [stdout] 914 | / pub fn adaptive_threshold_gaussian(
[INFO] [stdout] 915 | |     input: &Tensor,
[INFO] [stdout] 916 | |     max_val: f32,
[INFO] [stdout] 917 | |     block_size: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 980 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 981 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Adaptive threshold using Gaussian-weighted local mean. Input: `[H, W]` grayscale.`
[INFO] [stdout]     = help: ends near `Adaptive threshold using a Gaussian-weighted local window.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/threshold.rs:914:1
[INFO] [stdout]     |
[INFO] [stdout] 914 | / pub fn adaptive_threshold_gaussian(
[INFO] [stdout] 915 | |     input: &Tensor,
[INFO] [stdout] 916 | |     max_val: f32,
[INFO] [stdout] 917 | |     block_size: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 980 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 981 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Adaptive threshold using a Gaussian-weighted local window.`
[INFO] [stdout]     = help: ends near `Adaptive threshold using a Gaussian-weighted local window.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/threshold.rs:863:1
[INFO] [stdout]     |
[INFO] [stdout] 863 | / pub fn adaptive_threshold_mean(
[INFO] [stdout] 864 | |     input: &Tensor,
[INFO] [stdout] 865 | |     max_val: f32,
[INFO] [stdout] 866 | |     block_size: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 908 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 909 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Adaptive threshold using box-filter local mean. Input: `[H, W]` grayscale.`
[INFO] [stdout]     = help: ends near `Adaptive threshold using a local mean window.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/threshold.rs:863:1
[INFO] [stdout]     |
[INFO] [stdout] 863 | / pub fn adaptive_threshold_mean(
[INFO] [stdout] 864 | |     input: &Tensor,
[INFO] [stdout] 865 | |     max_val: f32,
[INFO] [stdout] 866 | |     block_size: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 908 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 909 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Adaptive threshold using a local mean window.`
[INFO] [stdout]     = help: ends near `Adaptive threshold using a local mean window.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/intensity.rs:10:1
[INFO] [stdout]    |
[INFO] [stdout] 10 | / pub fn adjust_gamma(img: &Tensor, gamma: f32) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 11 | |     let (h, w, c) = hwc_shape(img)?;
[INFO] [stdout] 12 | |     let data = img.data();
[INFO] [stdout] 13 | |     let mut out = vec![0.0f32; h * w * c];
[INFO] [stdout] ...  |
[INFO] [stdout] 19 | |     Tensor::from_vec(vec![h, w, c], out).map_err(Into::into)
[INFO] [stdout] 20 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Gamma correction. Input: `[H, W]` or `[H, W, C]`.`
[INFO] [stdout]    = help: ends near `Applies gamma correction to each pixel: `pixel^gamma`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/intensity.rs:10:1
[INFO] [stdout]    |
[INFO] [stdout] 10 | / pub fn adjust_gamma(img: &Tensor, gamma: f32) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 11 | |     let (h, w, c) = hwc_shape(img)?;
[INFO] [stdout] 12 | |     let data = img.data();
[INFO] [stdout] 13 | |     let mut out = vec![0.0f32; h * w * c];
[INFO] [stdout] ...  |
[INFO] [stdout] 19 | |     Tensor::from_vec(vec![h, w, c], out).map_err(Into::into)
[INFO] [stdout] 20 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Applies gamma correction to each pixel: `pixel^gamma`.`
[INFO] [stdout]    = help: ends near `Applies gamma correction to each pixel: `pixel^gamma`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/intensity.rs:60:1
[INFO] [stdout]    |
[INFO] [stdout] 60 | / pub fn adjust_log(img: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 61 | |     let (h, w, c) = hwc_shape(img)?;
[INFO] [stdout] 62 | |     let data = img.data();
[INFO] [stdout] 63 | |     let mut out = vec![0.0f32; h * w * c];
[INFO] [stdout] ...  |
[INFO] [stdout] 82 | |     Tensor::from_vec(vec![h, w, c], out).map_err(Into::into)
[INFO] [stdout] 83 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Logarithmic intensity adjustment.`
[INFO] [stdout]    = help: ends near `Applies logarithmic transform: `log(1 + pixel)`, normalized to `[0, 1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/intensity.rs:60:1
[INFO] [stdout]    |
[INFO] [stdout] 60 | / pub fn adjust_log(img: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 61 | |     let (h, w, c) = hwc_shape(img)?;
[INFO] [stdout] 62 | |     let data = img.data();
[INFO] [stdout] 63 | |     let mut out = vec![0.0f32; h * w * c];
[INFO] [stdout] ...  |
[INFO] [stdout] 82 | |     Tensor::from_vec(vec![h, w, c], out).map_err(Into::into)
[INFO] [stdout] 83 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Applies logarithmic transform: `log(1 + pixel)`, normalized to `[0, 1]`.`
[INFO] [stdout]    = help: ends near `Applies logarithmic transform: `log(1 + pixel)`, normalized to `[0, 1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:519:1
[INFO] [stdout]     |
[INFO] [stdout] 519 | / pub fn approx_poly_dp(contour: &[(f32, f32)], epsilon: f32) -> Vec<(f32, f32)> {
[INFO] [stdout] 520 | |     if contour.len() <= 2 {
[INFO] [stdout] 521 | |         return contour.to_vec();
[INFO] [stdout] ...   |
[INFO] [stdout] 545 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Approximate a contour with fewer vertices (Ramer-Douglas-Peucker).`
[INFO] [stdout]     = help: ends near `Douglas-Peucker contour approximation.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:519:1
[INFO] [stdout]     |
[INFO] [stdout] 519 | / pub fn approx_poly_dp(contour: &[(f32, f32)], epsilon: f32) -> Vec<(f32, f32)> {
[INFO] [stdout] 520 | |     if contour.len() <= 2 {
[INFO] [stdout] 521 | |         return contour.to_vec();
[INFO] [stdout] ...   |
[INFO] [stdout] 545 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Douglas-Peucker contour approximation.`
[INFO] [stdout]     = help: ends near `Douglas-Peucker contour approximation.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/contours.rs:1050:1
[INFO] [stdout]      |
[INFO] [stdout] 1050 | / pub fn arc_length(contour: &[(usize, usize)], closed: bool) -> f64 {
[INFO] [stdout] 1051 | |     if contour.len() < 2 {
[INFO] [stdout] 1052 | |         return 0.0;
[INFO] [stdout] ...    |
[INFO] [stdout] 1065 | |     length
[INFO] [stdout] 1066 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Compute the arc length (perimeter) of a contour.`
[INFO] [stdout]      = help: ends near `Computes the perimeter (arc length) of a contour.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/contours.rs:1050:1
[INFO] [stdout]      |
[INFO] [stdout] 1050 | / pub fn arc_length(contour: &[(usize, usize)], closed: bool) -> f64 {
[INFO] [stdout] 1051 | |     if contour.len() < 2 {
[INFO] [stdout] 1052 | |         return 0.0;
[INFO] [stdout] ...    |
[INFO] [stdout] 1065 | |     length
[INFO] [stdout] 1066 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Computes the perimeter (arc length) of a contour.`
[INFO] [stdout]      = help: ends near `Computes the perimeter (arc length) of a contour.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/filter.rs:1169:1
[INFO] [stdout]      |
[INFO] [stdout] 1169 | / pub fn bilateral_filter(
[INFO] [stdout] 1170 | |     input: &Tensor,
[INFO] [stdout] 1171 | |     d: usize,
[INFO] [stdout] 1172 | |     sigma_color: f32,
[INFO] [stdout] ...    |
[INFO] [stdout] 1344 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 1345 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Edge-preserving bilateral filter. Input: `[H, W]` or `[H, W, C]`.`
[INFO] [stdout]      = help: ends near `Bilateral filter on a single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/filter.rs:1169:1
[INFO] [stdout]      |
[INFO] [stdout] 1169 | / pub fn bilateral_filter(
[INFO] [stdout] 1170 | |     input: &Tensor,
[INFO] [stdout] 1171 | |     d: usize,
[INFO] [stdout] 1172 | |     sigma_color: f32,
[INFO] [stdout] ...    |
[INFO] [stdout] 1344 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 1345 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Bilateral filter on a single-channel `[H, W, 1]` image.`
[INFO] [stdout]      = help: ends near `Bilateral filter on a single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:2084:1
[INFO] [stdout]      |
[INFO] [stdout] 2084 | / pub fn blob_log(
[INFO] [stdout] 2085 | |     img: &Tensor,
[INFO] [stdout] 2086 | |     min_sigma: f32,
[INFO] [stdout] 2087 | |     max_sigma: f32,
[INFO] [stdout] ...    |
[INFO] [stdout] 2172 | |     Ok(blobs)
[INFO] [stdout] 2173 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Laplacian-of-Gaussian blob detection. Input: `[H, W]` grayscale.`
[INFO] [stdout]      = help: ends near `Laplacian-of-Gaussian blob detection on a grayscale `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:2084:1
[INFO] [stdout]      |
[INFO] [stdout] 2084 | / pub fn blob_log(
[INFO] [stdout] 2085 | |     img: &Tensor,
[INFO] [stdout] 2086 | |     min_sigma: f32,
[INFO] [stdout] 2087 | |     max_sigma: f32,
[INFO] [stdout] ...    |
[INFO] [stdout] 2172 | |     Ok(blobs)
[INFO] [stdout] 2173 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Laplacian-of-Gaussian blob detection on a grayscale `[H, W, 1]` image.`
[INFO] [stdout]      = help: ends near `Laplacian-of-Gaussian blob detection on a grayscale `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/contours.rs:1071:1
[INFO] [stdout]      |
[INFO] [stdout] 1071 | / pub fn bounding_rect(contour: &[(usize, usize)]) -> (usize, usize, usize, usize) {
[INFO] [stdout] 1072 | |     if contour.is_empty() {
[INFO] [stdout] 1073 | |         return (0, 0, 0, 0);
[INFO] [stdout] ...    |
[INFO] [stdout] 1085 | |     (min_x, min_y, max_x - min_x, max_y - min_y)
[INFO] [stdout] 1086 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Compute the bounding rectangle of a contour.`
[INFO] [stdout]      = help: ends near `Computes the axis-aligned bounding rectangle of a contour.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/contours.rs:1071:1
[INFO] [stdout]      |
[INFO] [stdout] 1071 | / pub fn bounding_rect(contour: &[(usize, usize)]) -> (usize, usize, usize, usize) {
[INFO] [stdout] 1072 | |     if contour.is_empty() {
[INFO] [stdout] 1073 | |         return (0, 0, 0, 0);
[INFO] [stdout] ...    |
[INFO] [stdout] 1085 | |     (min_x, min_y, max_x - min_x, max_y - min_y)
[INFO] [stdout] 1086 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Computes the axis-aligned bounding rectangle of a contour.`
[INFO] [stdout]      = help: ends near `Computes the axis-aligned bounding rectangle of a contour.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/filter.rs:154:1
[INFO] [stdout]     |
[INFO] [stdout] 154 | / pub fn box_blur_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 155 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 156 | |     let data = input.data();
[INFO] [stdout] 157 | |     let row_len = w * channels;
[INFO] [stdout] ...   |
[INFO] [stdout] 272 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 273 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 box blur (mean filter). Input: `[H, W]` or `[H, W, C]` f32.`
[INFO] [stdout]     = help: ends near `Applies zero-padded 3x3 box blur over each channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/filter.rs:154:1
[INFO] [stdout]     |
[INFO] [stdout] 154 | / pub fn box_blur_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 155 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 156 | |     let data = input.data();
[INFO] [stdout] 157 | |     let row_len = w * channels;
[INFO] [stdout] ...   |
[INFO] [stdout] 272 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 273 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Applies zero-padded 3x3 box blur over each channel.`
[INFO] [stdout]     = help: ends near `Applies zero-padded 3x3 box blur over each channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/surf.rs:21:1
[INFO] [stdout]    |
[INFO] [stdout] 21 | / pub fn build_integral_image(image: &[f32], width: usize, height: usize) -> Vec<f64> {
[INFO] [stdout] 22 | |     let mut integral = vec![0.0f64; width * height];
[INFO] [stdout] 23 | |     for y in 0..height {
[INFO] [stdout] 24 | |         let mut row_sum = 0.0f64;
[INFO] [stdout] ...  |
[INFO] [stdout] 35 | |     integral
[INFO] [stdout] 36 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Build integral image (summed area table) for SURF.`
[INFO] [stdout]    = help: ends near `Build integral image for fast box filter computation.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/surf.rs:21:1
[INFO] [stdout]    |
[INFO] [stdout] 21 | / pub fn build_integral_image(image: &[f32], width: usize, height: usize) -> Vec<f64> {
[INFO] [stdout] 22 | |     let mut integral = vec![0.0f64; width * height];
[INFO] [stdout] 23 | |     for y in 0..height {
[INFO] [stdout] 24 | |         let mut row_sum = 0.0f64;
[INFO] [stdout] ...  |
[INFO] [stdout] 35 | |     integral
[INFO] [stdout] 36 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Build integral image for fast box filter computation.`
[INFO] [stdout]    = help: ends near `Build integral image for fast box filter computation.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/threshold.rs:725:1
[INFO] [stdout]     |
[INFO] [stdout] 725 | / pub fn canny_with_scratch(
[INFO] [stdout] 726 | |     input: &Tensor,
[INFO] [stdout] 727 | |     low_thresh: f32,
[INFO] [stdout] 728 | |     high_thresh: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 856 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 857 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Canny edge detection with pre-allocated scratch buffers for zero-alloc hot paths.`
[INFO] [stdout]     = help: ends near `Canny edge detection with reusable scratch buffers.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/threshold.rs:725:1
[INFO] [stdout]     |
[INFO] [stdout] 725 | / pub fn canny_with_scratch(
[INFO] [stdout] 726 | |     input: &Tensor,
[INFO] [stdout] 727 | |     low_thresh: f32,
[INFO] [stdout] 728 | |     high_thresh: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 856 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 857 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Canny edge detection with reusable scratch buffers.`
[INFO] [stdout]     = help: ends near `Canny edge detection with reusable scratch buffers.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/histogram.rs:248:1
[INFO] [stdout]     |
[INFO] [stdout] 248 | / pub fn clahe(
[INFO] [stdout] 249 | |     input: &Tensor,
[INFO] [stdout] 250 | |     tile_h: usize,
[INFO] [stdout] 251 | |     tile_w: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 379 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 380 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Contrast-limited adaptive histogram equalization. Input: `[H, W]` grayscale.`
[INFO] [stdout]     = help: ends near `Applies CLAHE to a grayscale `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/histogram.rs:248:1
[INFO] [stdout]     |
[INFO] [stdout] 248 | / pub fn clahe(
[INFO] [stdout] 249 | |     input: &Tensor,
[INFO] [stdout] 250 | |     tile_h: usize,
[INFO] [stdout] 251 | |     tile_w: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 379 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 380 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Applies CLAHE to a grayscale `[H, W, 1]` image.`
[INFO] [stdout]     = help: ends near `Applies CLAHE to a grayscale `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:1715:1
[INFO] [stdout]      |
[INFO] [stdout] 1715 | / pub fn close_binary_box(input: &Tensor, ksize: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1716 | |     let mut mask = packed_from_tensor(input, ksize)?;
[INFO] [stdout] 1717 | |     dilate_packed(&mut mask, ksize);
[INFO] [stdout] 1718 | |     erode_packed(&mut mask, ksize);
[INFO] [stdout] 1719 | |     tensor_from_packed(&mask)
[INFO] [stdout] 1720 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Binary dilation via sliding-window counts (~2 ops/pixel).`
[INFO] [stdout]      = help: ends near `See [`open_binary_box`].`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:1715:1
[INFO] [stdout]      |
[INFO] [stdout] 1715 | / pub fn close_binary_box(input: &Tensor, ksize: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1716 | |     let mut mask = packed_from_tensor(input, ksize)?;
[INFO] [stdout] 1717 | |     dilate_packed(&mut mask, ksize);
[INFO] [stdout] 1718 | |     erode_packed(&mut mask, ksize);
[INFO] [stdout] 1719 | |     tensor_from_packed(&mask)
[INFO] [stdout] 1720 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Binary closing (dilate then erode) with one pack/unpack round trip.`
[INFO] [stdout]      = help: ends near `Binary closing (dilate then erode) with one pack/unpack round trip.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/morphology.rs:911:1
[INFO] [stdout]     |
[INFO] [stdout] 911 | / pub fn closing_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 912 | |     let dilated = dilate_3x3(input)?;
[INFO] [stdout] 913 | |     erode_3x3(&dilated)
[INFO] [stdout] 914 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Morphological closing (dilate then erode) with 3x3 structuring element.`
[INFO] [stdout]     = help: ends near `Applies a 3x3 closing (`dilate` followed by `erode`) per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/morphology.rs:911:1
[INFO] [stdout]     |
[INFO] [stdout] 911 | / pub fn closing_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 912 | |     let dilated = dilate_3x3(input)?;
[INFO] [stdout] 913 | |     erode_3x3(&dilated)
[INFO] [stdout] 914 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Applies a 3x3 closing (`dilate` followed by `erode`) per channel.`
[INFO] [stdout]     = help: ends near `Applies a 3x3 closing (`dilate` followed by `erode`) per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/brief.rs:62:1
[INFO] [stdout]     |
[INFO] [stdout]  62 | / pub fn compute_brief(
[INFO] [stdout]  63 | |     image: &Tensor,
[INFO] [stdout]  64 | |     keypoints: &[Keypoint],
[INFO] [stdout]  65 | | ) -> Result<Vec<BriefDescriptor>, ImgProcError> {
[INFO] [stdout] ...   |
[INFO] [stdout] 103 | |     Ok(descriptors)
[INFO] [stdout] 104 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Compute BRIEF binary descriptors at given keypoints. Input: `[H, W]` grayscale.`
[INFO] [stdout]     = help: ends near `Compute BRIEF descriptors for keypoints on a grayscale `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/brief.rs:62:1
[INFO] [stdout]     |
[INFO] [stdout]  62 | / pub fn compute_brief(
[INFO] [stdout]  63 | |     image: &Tensor,
[INFO] [stdout]  64 | |     keypoints: &[Keypoint],
[INFO] [stdout]  65 | | ) -> Result<Vec<BriefDescriptor>, ImgProcError> {
[INFO] [stdout] ...   |
[INFO] [stdout] 103 | |     Ok(descriptors)
[INFO] [stdout] 104 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Compute BRIEF descriptors for keypoints on a grayscale `[H, W, 1]` image.`
[INFO] [stdout]     = help: ends near `Compute BRIEF descriptors for keypoints on a grayscale `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1902:1
[INFO] [stdout]      |
[INFO] [stdout] 1902 | / pub fn compute_gradient_orientation(image: &Tensor) -> Result<(Tensor, Tensor), ImgProcError> {
[INFO] [stdout] 1903 | |     let (h, w, c) = hwc_shape(image)?;
[INFO] [stdout] 1904 | |     if c != 1 {
[INFO] [stdout] 1905 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1925 | |     Ok((mag_t, ori_t))
[INFO] [stdout] 1926 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Compute gradient orientation from Sobel gradients.`
[INFO] [stdout]      = help: ends near `Returns a gradient magnitude + orientation pair per pixel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1902:1
[INFO] [stdout]      |
[INFO] [stdout] 1902 | / pub fn compute_gradient_orientation(image: &Tensor) -> Result<(Tensor, Tensor), ImgProcError> {
[INFO] [stdout] 1903 | |     let (h, w, c) = hwc_shape(image)?;
[INFO] [stdout] 1904 | |     if c != 1 {
[INFO] [stdout] 1905 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1925 | |     Ok((mag_t, ori_t))
[INFO] [stdout] 1926 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Computes image gradients and orientation for descriptor construction.`
[INFO] [stdout]      = help: ends near `Computes image gradients and orientation for descriptor construction.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/surf.rs:361:1
[INFO] [stdout]     |
[INFO] [stdout] 361 | / pub fn compute_surf_descriptors(
[INFO] [stdout] 362 | |     image: &Tensor,
[INFO] [stdout] 363 | |     keypoints: &[SurfKeypoint],
[INFO] [stdout] 364 | | ) -> Result<Vec<SurfDescriptor>, ImgProcError> {
[INFO] [stdout] ...   |
[INFO] [stdout] 479 | |     Ok(descriptors)
[INFO] [stdout] 480 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Compute SURF descriptors at detected keypoints.`
[INFO] [stdout]     = help: ends near `Compute SURF descriptors for detected keypoints.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/surf.rs:361:1
[INFO] [stdout]     |
[INFO] [stdout] 361 | / pub fn compute_surf_descriptors(
[INFO] [stdout] 362 | |     image: &Tensor,
[INFO] [stdout] 363 | |     keypoints: &[SurfKeypoint],
[INFO] [stdout] 364 | | ) -> Result<Vec<SurfDescriptor>, ImgProcError> {
[INFO] [stdout] ...   |
[INFO] [stdout] 479 | |     Ok(descriptors)
[INFO] [stdout] 480 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Compute SURF descriptors for detected keypoints.`
[INFO] [stdout]     = help: ends near `Compute SURF descriptors for detected keypoints.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/threshold.rs:987:1
[INFO] [stdout]      |
[INFO] [stdout]  987 | / pub fn connected_components_4(input: &Tensor) -> Result<(Tensor, usize), ImgProcError> {
[INFO] [stdout]  988 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout]  989 | |     if channels != 1 {
[INFO] [stdout]  990 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1059 | |     Ok((Tensor::from_vec(vec![h, w, 1], out)?, label_count as usize))
[INFO] [stdout] 1060 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `4-connected component labeling. Input: `[H, W]` binary.`
[INFO] [stdout]      = help: ends near `Connected-component labeling on a binary single-channel HWC image (4-connectivity).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/threshold.rs:987:1
[INFO] [stdout]      |
[INFO] [stdout]  987 | / pub fn connected_components_4(input: &Tensor) -> Result<(Tensor, usize), ImgProcError> {
[INFO] [stdout]  988 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout]  989 | |     if channels != 1 {
[INFO] [stdout]  990 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1059 | |     Ok((Tensor::from_vec(vec![h, w, 1], out)?, label_count as usize))
[INFO] [stdout] 1060 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Connected-component labeling on a binary single-channel HWC image (4-connectivity).`
[INFO] [stdout]      = help: ends near `Connected-component labeling on a binary single-channel HWC image (4-connectivity).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:743:1
[INFO] [stdout]     |
[INFO] [stdout] 743 | / pub fn connected_components_with_stats(
[INFO] [stdout] 744 | |     img: &Tensor,
[INFO] [stdout] 745 | | ) -> Result<(Tensor, Vec<ComponentStats>), ImgProcError> {
[INFO] [stdout] 746 | |     label_components(img, false)
[INFO] [stdout] 747 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Connected components with statistics (area, bounding box, centroid).`
[INFO] [stdout]     = help: ends near `Connected-component labelling with per-component statistics.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:743:1
[INFO] [stdout]     |
[INFO] [stdout] 743 | / pub fn connected_components_with_stats(
[INFO] [stdout] 744 | |     img: &Tensor,
[INFO] [stdout] 745 | | ) -> Result<(Tensor, Vec<ComponentStats>), ImgProcError> {
[INFO] [stdout] 746 | |     label_components(img, false)
[INFO] [stdout] 747 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Connected-component labelling with per-component statistics.`
[INFO] [stdout]     = help: ends near `Connected-component labelling with per-component statistics.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:755:1
[INFO] [stdout]     |
[INFO] [stdout] 755 | / pub fn connected_components_with_stats_8(
[INFO] [stdout] 756 | |     img: &Tensor,
[INFO] [stdout] 757 | | ) -> Result<(Tensor, Vec<ComponentStats>), ImgProcError> {
[INFO] [stdout] 758 | |     label_components(img, true)
[INFO] [stdout] 759 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Connected-component labelling with statistics (8-connectivity).`
[INFO] [stdout]     = help: ends near `Connected-component labelling with per-component statistics, 8-connectivity.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:755:1
[INFO] [stdout]     |
[INFO] [stdout] 755 | / pub fn connected_components_with_stats_8(
[INFO] [stdout] 756 | |     img: &Tensor,
[INFO] [stdout] 757 | | ) -> Result<(Tensor, Vec<ComponentStats>), ImgProcError> {
[INFO] [stdout] 758 | |     label_components(img, true)
[INFO] [stdout] 759 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Connected-component labelling with per-component statistics, 8-connectivity.`
[INFO] [stdout]     = help: ends near `Connected-component labelling with per-component statistics, 8-connectivity.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/contours.rs:1031:1
[INFO] [stdout]      |
[INFO] [stdout] 1031 | / pub fn contour_area(contour: &[(usize, usize)]) -> f64 {
[INFO] [stdout] 1032 | |     if contour.len() < 3 {
[INFO] [stdout] 1033 | |         return 0.0;
[INFO] [stdout] ...    |
[INFO] [stdout] 1043 | |     sum.abs() / 2.0
[INFO] [stdout] 1044 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Compute contour area (signed, using shoelace formula).`
[INFO] [stdout]      = help: ends near `Computes the area of a polygon defined by its vertices using the Shoelace formula.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/contours.rs:1031:1
[INFO] [stdout]      |
[INFO] [stdout] 1031 | / pub fn contour_area(contour: &[(usize, usize)]) -> f64 {
[INFO] [stdout] 1032 | |     if contour.len() < 3 {
[INFO] [stdout] 1033 | |         return 0.0;
[INFO] [stdout] ...    |
[INFO] [stdout] 1043 | |     sum.abs() / 2.0
[INFO] [stdout] 1044 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Computes the area of a polygon defined by its vertices using the Shoelace formula.`
[INFO] [stdout]      = help: ends near `Computes the area of a polygon defined by its vertices using the Shoelace formula.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:109:1
[INFO] [stdout]     |
[INFO] [stdout] 109 | / pub fn convex_hull(points: &[(f32, f32)]) -> Vec<(f32, f32)> {
[INFO] [stdout] 110 | |     if points.len() < 3 {
[INFO] [stdout] 111 | |         return points.to_vec();
[INFO] [stdout] ...   |
[INFO] [stdout] 141 | |     hull
[INFO] [stdout] 142 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Compute the convex hull of a set of 2D points.`
[INFO] [stdout]     = help: ends near `Computes the convex hull of 2D points using Andrew's monotone chain algorithm.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:109:1
[INFO] [stdout]     |
[INFO] [stdout] 109 | / pub fn convex_hull(points: &[(f32, f32)]) -> Vec<(f32, f32)> {
[INFO] [stdout] 110 | |     if points.len() < 3 {
[INFO] [stdout] 111 | |         return points.to_vec();
[INFO] [stdout] ...   |
[INFO] [stdout] 141 | |     hull
[INFO] [stdout] 142 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Computes the convex hull of 2D points using Andrew's monotone chain algorithm.`
[INFO] [stdout]     = help: ends near `Computes the convex hull of 2D points using Andrew's monotone chain algorithm.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1817:1
[INFO] [stdout]      |
[INFO] [stdout] 1817 | / pub fn corner_sub_pix(
[INFO] [stdout] 1818 | |     img: &Tensor,
[INFO] [stdout] 1819 | |     corners: &[(usize, usize)],
[INFO] [stdout] 1820 | |     win_size: usize,
[INFO] [stdout] ...    |
[INFO] [stdout] 1895 | |     Ok(refined)
[INFO] [stdout] 1896 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Sub-pixel corner refinement.`
[INFO] [stdout]      = help: ends near `Refines corner locations to sub-pixel accuracy using gradient-based method.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1817:1
[INFO] [stdout]      |
[INFO] [stdout] 1817 | / pub fn corner_sub_pix(
[INFO] [stdout] 1818 | |     img: &Tensor,
[INFO] [stdout] 1819 | |     corners: &[(usize, usize)],
[INFO] [stdout] 1820 | |     win_size: usize,
[INFO] [stdout] ...    |
[INFO] [stdout] 1895 | |     Ok(refined)
[INFO] [stdout] 1896 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Refines corner locations to sub-pixel accuracy using gradient-based method.`
[INFO] [stdout]      = help: ends near `Refines corner locations to sub-pixel accuracy using gradient-based method.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:702:1
[INFO] [stdout]     |
[INFO] [stdout] 702 | / pub fn crop(
[INFO] [stdout] 703 | |     input: &Tensor,
[INFO] [stdout] 704 | |     top: usize,
[INFO] [stdout] 705 | |     left: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 728 | |     Tensor::from_vec(vec![crop_h, crop_w, channels], out).map_err(Into::into)
[INFO] [stdout] 729 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Crop a region from an image tensor. Input: `[H, W, C]` or `[H, W]`.`
[INFO] [stdout]     = help: ends near `Crops an HWC tensor to `[crop_h, crop_w, C]` starting at `(top, left)`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:702:1
[INFO] [stdout]     |
[INFO] [stdout] 702 | / pub fn crop(
[INFO] [stdout] 703 | |     input: &Tensor,
[INFO] [stdout] 704 | |     top: usize,
[INFO] [stdout] 705 | |     left: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 728 | |     Tensor::from_vec(vec![crop_h, crop_w, channels], out).map_err(Into::into)
[INFO] [stdout] 729 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Crops an HWC tensor to `[crop_h, crop_w, C]` starting at `(top, left)`.`
[INFO] [stdout]     = help: ends near `Crops an HWC tensor to `[crop_h, crop_w, C]` starting at `(top, left)`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/flow.rs:471:1
[INFO] [stdout]     |
[INFO] [stdout] 471 | / pub fn dense_optical_flow(
[INFO] [stdout] 472 | |     prev: &Tensor,
[INFO] [stdout] 473 | |     next: &Tensor,
[INFO] [stdout] 474 | |     window_size: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 560 | |     Tensor::from_vec(vec![h, w, 2], out).map_err(Into::into)
[INFO] [stdout] 561 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Dense optical flow (Farneback method). Input: two consecutive `[H, W]` grayscale frames.`
[INFO] [stdout]     = help: ends near `Dense optical flow estimation between two grayscale `[H,W,1]` frames.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/flow.rs:471:1
[INFO] [stdout]     |
[INFO] [stdout] 471 | / pub fn dense_optical_flow(
[INFO] [stdout] 472 | |     prev: &Tensor,
[INFO] [stdout] 473 | |     next: &Tensor,
[INFO] [stdout] 474 | |     window_size: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 560 | |     Tensor::from_vec(vec![h, w, 2], out).map_err(Into::into)
[INFO] [stdout] 561 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Dense optical flow estimation between two grayscale `[H,W,1]` frames.`
[INFO] [stdout]     = help: ends near `Dense optical flow estimation between two grayscale `[H,W,1]` frames.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/orb.rs:49:1
[INFO] [stdout]     |
[INFO] [stdout]  49 | / pub fn detect_orb(image: &Tensor, config: &OrbConfig) -> Result<Vec<OrbFeature>, ImgProcError> {
[INFO] [stdout]  50 | |     let (h, w, c) = hwc_shape(image)?;
[INFO] [stdout]  51 | |     if c != 1 {
[INFO] [stdout]  52 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 145 | |     Ok(all_features)
[INFO] [stdout] 146 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Detect ORB features (keypoints + descriptors). Input: `[H, W]` grayscale f32.`
[INFO] [stdout]     = help: ends near `Detect ORB features: oriented FAST keypoints + rotated BRIEF descriptors.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/orb.rs:49:1
[INFO] [stdout]     |
[INFO] [stdout]  49 | / pub fn detect_orb(image: &Tensor, config: &OrbConfig) -> Result<Vec<OrbFeature>, ImgProcError> {
[INFO] [stdout]  50 | |     let (h, w, c) = hwc_shape(image)?;
[INFO] [stdout]  51 | |     if c != 1 {
[INFO] [stdout]  52 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 145 | |     Ok(all_features)
[INFO] [stdout] 146 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Detect ORB features: oriented FAST keypoints + rotated BRIEF descriptors.`
[INFO] [stdout]     = help: ends near `Detect ORB features: oriented FAST keypoints + rotated BRIEF descriptors.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/surf.rs:138:1
[INFO] [stdout]     |
[INFO] [stdout] 138 | / pub fn detect_surf_keypoints(
[INFO] [stdout] 139 | |     image: &Tensor,
[INFO] [stdout] 140 | |     hessian_threshold: f32,
[INFO] [stdout] 141 | |     num_octaves: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 243 | |     Ok(keypoints)
[INFO] [stdout] 244 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Detect SURF keypoints using fast Hessian response.`
[INFO] [stdout]     = help: ends near `Detect SURF keypoints using box-filter approximation of Hessian.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/surf.rs:138:1
[INFO] [stdout]     |
[INFO] [stdout] 138 | / pub fn detect_surf_keypoints(
[INFO] [stdout] 139 | |     image: &Tensor,
[INFO] [stdout] 140 | |     hessian_threshold: f32,
[INFO] [stdout] 141 | |     num_octaves: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 243 | |     Ok(keypoints)
[INFO] [stdout] 244 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Detect SURF keypoints using box-filter approximation of Hessian.`
[INFO] [stdout]     = help: ends near `Detect SURF keypoints using box-filter approximation of Hessian.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/morphology.rs:933:1
[INFO] [stdout]     |
[INFO] [stdout] 933 | / pub fn dilate(input: &Tensor, kernel: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 934 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 935 | |     if c != 1 {
[INFO] [stdout] 936 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 973 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 974 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Morphological dilation with arbitrary structuring element.`
[INFO] [stdout]     = help: ends near `Dilate a single-channel `[H, W, 1]` image with an arbitrary structuring element.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/morphology.rs:933:1
[INFO] [stdout]     |
[INFO] [stdout] 933 | / pub fn dilate(input: &Tensor, kernel: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 934 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 935 | |     if c != 1 {
[INFO] [stdout] 936 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 973 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 974 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Dilate a single-channel `[H, W, 1]` image with an arbitrary structuring element.`
[INFO] [stdout]     = help: ends near `Dilate a single-channel `[H, W, 1]` image with an arbitrary structuring element.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/morphology.rs:594:1
[INFO] [stdout]     |
[INFO] [stdout] 594 | / pub fn dilate_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 595 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 596 | |     let total = h * w * channels;
[INFO] [stdout] 597 | |     let mut out = vec![0.0f32; total];
[INFO] [stdout] ...   |
[INFO] [stdout] 748 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 749 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Morphological dilation with 3x3 square structuring element.`
[INFO] [stdout]     = help: ends near `Applies a 3x3 grayscale/RGB dilation (local maximum per channel).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/morphology.rs:594:1
[INFO] [stdout]     |
[INFO] [stdout] 594 | / pub fn dilate_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 595 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 596 | |     let total = h * w * channels;
[INFO] [stdout] 597 | |     let mut out = vec![0.0f32; total];
[INFO] [stdout] ...   |
[INFO] [stdout] 748 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 749 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Applies a 3x3 grayscale/RGB dilation (local maximum per channel).`
[INFO] [stdout]     = help: ends near `Applies a 3x3 grayscale/RGB dilation (local maximum per channel).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:1312:1
[INFO] [stdout]      |
[INFO] [stdout] 1312 | / pub fn dilate_box(input: &Tensor, ksize: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1313 | |     box_filter_2d(input, ksize, f32::max, f32::NEG_INFINITY)
[INFO] [stdout] 1314 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Dilation with an all-ones square kernel — separable, O(n) per pass.`
[INFO] [stdout]      = help: ends near `Dilation with an all-ones square kernel of odd size `ksize`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:1312:1
[INFO] [stdout]      |
[INFO] [stdout] 1312 | / pub fn dilate_box(input: &Tensor, ksize: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1313 | |     box_filter_2d(input, ksize, f32::max, f32::NEG_INFINITY)
[INFO] [stdout] 1314 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Dilation with an all-ones square kernel of odd size `ksize`.`
[INFO] [stdout]      = help: ends near `Dilation with an all-ones square kernel of odd size `ksize`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:1168:1
[INFO] [stdout]      |
[INFO] [stdout] 1168 | / pub fn erode(input: &Tensor, kernel: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1169 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1170 | |     if c != 1 {
[INFO] [stdout] 1171 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1208 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 1209 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Morphological erosion with arbitrary structuring element.`
[INFO] [stdout]      = help: ends near `Erode a single-channel `[H, W, 1]` image with an arbitrary structuring element.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:1168:1
[INFO] [stdout]      |
[INFO] [stdout] 1168 | / pub fn erode(input: &Tensor, kernel: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1169 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1170 | |     if c != 1 {
[INFO] [stdout] 1171 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1208 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 1209 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Erode a single-channel `[H, W, 1]` image with an arbitrary structuring element.`
[INFO] [stdout]      = help: ends near `Erode a single-channel `[H, W, 1]` image with an arbitrary structuring element.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/morphology.rs:754:1
[INFO] [stdout]     |
[INFO] [stdout] 754 | / pub fn erode_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 755 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 756 | |     let total = h * w * channels;
[INFO] [stdout] 757 | |     let mut out = vec![0.0f32; total];
[INFO] [stdout] ...   |
[INFO] [stdout] 901 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 902 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Morphological erosion with 3x3 square structuring element.`
[INFO] [stdout]     = help: ends near `Applies a 3x3 grayscale/RGB erosion (local minimum per channel).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/morphology.rs:754:1
[INFO] [stdout]     |
[INFO] [stdout] 754 | / pub fn erode_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 755 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 756 | |     let total = h * w * channels;
[INFO] [stdout] 757 | |     let mut out = vec![0.0f32; total];
[INFO] [stdout] ...   |
[INFO] [stdout] 901 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 902 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Applies a 3x3 grayscale/RGB erosion (local minimum per channel).`
[INFO] [stdout]     = help: ends near `Applies a 3x3 grayscale/RGB erosion (local minimum per channel).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:1696:1
[INFO] [stdout]      |
[INFO] [stdout] 1696 | / pub fn erode_binary_box(input: &Tensor, ksize: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1697 | |     let mut mask = packed_from_tensor(input, ksize)?;
[INFO] [stdout] 1698 | |     erode_packed(&mut mask, ksize);
[INFO] [stdout] 1699 | |     tensor_from_packed(&mask)
[INFO] [stdout] 1700 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Binary erosion via sliding-window counts (~2 ops/pixel).`
[INFO] [stdout]      = help: ends near `window is clamped at image edges). See [`dilate_binary_box`].`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:1696:1
[INFO] [stdout]      |
[INFO] [stdout] 1696 | / pub fn erode_binary_box(input: &Tensor, ksize: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1697 | |     let mut mask = packed_from_tensor(input, ksize)?;
[INFO] [stdout] 1698 | |     erode_packed(&mut mask, ksize);
[INFO] [stdout] 1699 | |     tensor_from_packed(&mask)
[INFO] [stdout] 1700 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Binary erosion with a ksize×ksize ones kernel: a pixel survives when`
[INFO] [stdout]      = help: ends near `Binary erosion with a ksize×ksize ones kernel: a pixel survives when`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:1318:1
[INFO] [stdout]      |
[INFO] [stdout] 1318 | / pub fn erode_box(input: &Tensor, ksize: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1319 | |     box_filter_2d(input, ksize, f32::min, f32::INFINITY)
[INFO] [stdout] 1320 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Erosion with an all-ones square kernel — separable, O(n) per pass.`
[INFO] [stdout]      = help: ends near `See [`dilate_box`] for semantics and complexity.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:1318:1
[INFO] [stdout]      |
[INFO] [stdout] 1318 | / pub fn erode_box(input: &Tensor, ksize: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1319 | |     box_filter_2d(input, ksize, f32::min, f32::INFINITY)
[INFO] [stdout] 1320 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Erosion with an all-ones square kernel of odd size `ksize`.`
[INFO] [stdout]      = help: ends near `Erosion with an all-ones square kernel of odd size `ksize`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/flow.rs:42:1
[INFO] [stdout]     |
[INFO] [stdout]  42 | / pub fn farneback_flow(
[INFO] [stdout]  43 | |     prev: &Tensor,
[INFO] [stdout]  44 | |     next: &Tensor,
[INFO] [stdout]  45 | |     config: &FarnebackConfig,
[INFO] [stdout] ...   |
[INFO] [stdout] 167 | |     Ok((fx_tensor, fy_tensor))
[INFO] [stdout] 168 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Farneback dense optical flow between two frames.`
[INFO] [stdout]     = help: ends near `Compute dense optical flow using Farneback's polynomial expansion method.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/flow.rs:42:1
[INFO] [stdout]     |
[INFO] [stdout]  42 | / pub fn farneback_flow(
[INFO] [stdout]  43 | |     prev: &Tensor,
[INFO] [stdout]  44 | |     next: &Tensor,
[INFO] [stdout]  45 | |     config: &FarnebackConfig,
[INFO] [stdout] ...   |
[INFO] [stdout] 167 | |     Ok((fx_tensor, fy_tensor))
[INFO] [stdout] 168 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Compute dense optical flow using Farneback's polynomial expansion method.`
[INFO] [stdout]     = help: ends near `Compute dense optical flow using Farneback's polynomial expansion method.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/features.rs:458:1
[INFO] [stdout]     |
[INFO] [stdout] 458 | / pub fn fast_corners(
[INFO] [stdout] 459 | |     input: &Tensor,
[INFO] [stdout] 460 | |     threshold: f32,
[INFO] [stdout] 461 | |     min_consecutive: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 561 | |     Ok(corners)
[INFO] [stdout] 562 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `FAST corner detection (configurable arc length).`
[INFO] [stdout]     = help: ends near `FAST-9 corner detector on a single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/features.rs:458:1
[INFO] [stdout]     |
[INFO] [stdout] 458 | / pub fn fast_corners(
[INFO] [stdout] 459 | |     input: &Tensor,
[INFO] [stdout] 460 | |     threshold: f32,
[INFO] [stdout] 461 | |     min_consecutive: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 561 | |     Ok(corners)
[INFO] [stdout] 562 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `FAST-9 corner detector on a single-channel `[H, W, 1]` image.`
[INFO] [stdout]     = help: ends near `FAST-9 corner detector on a single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/fast.rs:91:1
[INFO] [stdout]     |
[INFO] [stdout]  91 | / pub fn fast9_detect(
[INFO] [stdout]  92 | |     image: &Tensor,
[INFO] [stdout]  93 | |     threshold: f32,
[INFO] [stdout]  94 | |     non_max: bool,
[INFO] [stdout] ...   |
[INFO] [stdout] 103 | |     Ok(fast9_detect_raw(image.data(), h, w, threshold, non_max))
[INFO] [stdout] 104 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `FAST-9 corner detector. Input: `[H, W]` f32 grayscale.`
[INFO] [stdout]     = help: ends near `FAST-9 corner detection on a single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/fast.rs:91:1
[INFO] [stdout]     |
[INFO] [stdout]  91 | / pub fn fast9_detect(
[INFO] [stdout]  92 | |     image: &Tensor,
[INFO] [stdout]  93 | |     threshold: f32,
[INFO] [stdout]  94 | |     non_max: bool,
[INFO] [stdout] ...   |
[INFO] [stdout] 103 | |     Ok(fast9_detect_raw(image.data(), h, w, threshold, non_max))
[INFO] [stdout] 104 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `FAST-9 corner detection on a single-channel `[H, W, 1]` image.`
[INFO] [stdout]     = help: ends near `FAST-9 corner detection on a single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/filter.rs:1350:1
[INFO] [stdout]      |
[INFO] [stdout] 1350 | / pub fn filter2d(input: &Tensor, kernel: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1351 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1352 | |     if c != 1 {
[INFO] [stdout] 1353 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1387 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 1388 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Generic 2D convolution with a custom kernel.`
[INFO] [stdout]      = help: ends near `2D convolution of a single-channel `[H, W, 1]` image with an arbitrary kernel `[KH, KW, 1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/filter.rs:1350:1
[INFO] [stdout]      |
[INFO] [stdout] 1350 | / pub fn filter2d(input: &Tensor, kernel: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1351 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1352 | |     if c != 1 {
[INFO] [stdout] 1353 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1387 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 1388 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `2D convolution of a single-channel `[H, W, 1]` image with an arbitrary kernel `[KH, KW, 1]`.`
[INFO] [stdout]      = help: ends near `2D convolution of a single-channel `[H, W, 1]` image with an arbitrary kernel `[KH, KW, 1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:17:1
[INFO] [stdout]     |
[INFO] [stdout]  17 | / pub fn find_contours(input: &Tensor) -> Result<Vec<Contour>, ImgProcError> {
[INFO] [stdout]  18 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout]  19 | |     if c != 1 {
[INFO] [stdout]  20 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 103 | |     Ok(contours)
[INFO] [stdout] 104 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Find contours in a binary image. Input: `[H, W]` binary.`
[INFO] [stdout]     = help: ends near `Finds external contours in a binary single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:17:1
[INFO] [stdout]     |
[INFO] [stdout]  17 | / pub fn find_contours(input: &Tensor) -> Result<Vec<Contour>, ImgProcError> {
[INFO] [stdout]  18 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout]  19 | |     if c != 1 {
[INFO] [stdout]  20 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 103 | |     Ok(contours)
[INFO] [stdout] 104 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Finds external contours in a binary single-channel `[H, W, 1]` image.`
[INFO] [stdout]     = help: ends near `Finds external contours in a binary single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:462:1
[INFO] [stdout]     |
[INFO] [stdout] 462 | / pub fn fit_circle(points: &[(f32, f32)]) -> Option<(f32, f32, f32)> {
[INFO] [stdout] 463 | |     if points.len() < 3 {
[INFO] [stdout] 464 | |         return None;
[INFO] [stdout] ...   |
[INFO] [stdout] 512 | |     Some((cx as f32, cy as f32, r_sq.sqrt() as f32))
[INFO] [stdout] 513 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Fit an ellipse to a set of 2D points (least-squares).`
[INFO] [stdout]     = help: ends near `Least-squares circle fit (Kåsa method).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:462:1
[INFO] [stdout]     |
[INFO] [stdout] 462 | / pub fn fit_circle(points: &[(f32, f32)]) -> Option<(f32, f32, f32)> {
[INFO] [stdout] 463 | |     if points.len() < 3 {
[INFO] [stdout] 464 | |         return None;
[INFO] [stdout] ...   |
[INFO] [stdout] 512 | |     Some((cx as f32, cy as f32, r_sq.sqrt() as f32))
[INFO] [stdout] 513 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Least-squares circle fit (Kåsa method).`
[INFO] [stdout]     = help: ends near `Least-squares circle fit (Kåsa method).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:618:1
[INFO] [stdout]     |
[INFO] [stdout] 618 | / pub fn flip_horizontal(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 619 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 620 | |     let mut out = vec![0.0f32; input.len()];
[INFO] [stdout] ...   |
[INFO] [stdout] 632 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 633 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Flip image horizontally. Input: `[H, W, C]` or `[H, W]`.`
[INFO] [stdout]     = help: ends near `Flips an HWC tensor horizontally (mirror over vertical axis).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:618:1
[INFO] [stdout]     |
[INFO] [stdout] 618 | / pub fn flip_horizontal(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 619 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 620 | |     let mut out = vec![0.0f32; input.len()];
[INFO] [stdout] ...   |
[INFO] [stdout] 632 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 633 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Flips an HWC tensor horizontally (mirror over vertical axis).`
[INFO] [stdout]     = help: ends near `Flips an HWC tensor horizontally (mirror over vertical axis).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:636:1
[INFO] [stdout]     |
[INFO] [stdout] 636 | / pub fn flip_vertical(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 637 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 638 | |     let mut out = vec![0.0f32; input.len()];
[INFO] [stdout] ...   |
[INFO] [stdout] 650 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 651 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Flip image vertically. Input: `[H, W, C]` or `[H, W]`.`
[INFO] [stdout]     = help: ends near `Flips an HWC tensor vertically (mirror over horizontal axis).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:636:1
[INFO] [stdout]     |
[INFO] [stdout] 636 | / pub fn flip_vertical(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 637 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 638 | |     let mut out = vec![0.0f32; input.len()];
[INFO] [stdout] ...   |
[INFO] [stdout] 650 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 651 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Flips an HWC tensor vertically (mirror over horizontal axis).`
[INFO] [stdout]     = help: ends near `Flips an HWC tensor vertically (mirror over horizontal axis).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/filter.rs:373:1
[INFO] [stdout]     |
[INFO] [stdout] 373 | / pub fn gaussian_blur_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 374 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 375 | |     let data = input.data();
[INFO] [stdout] 376 | |     let total = h * w * channels;
[INFO] [stdout] ...   |
[INFO] [stdout] 501 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 502 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 Gaussian blur (sigma approx 0.85). Input: `[H, W]` or `[H, W, C]` f32.`
[INFO] [stdout]     = help: ends near `Kernel: `[[1,2,1],[2,4,2],[1,2,1]] / 16`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/filter.rs:373:1
[INFO] [stdout]     |
[INFO] [stdout] 373 | / pub fn gaussian_blur_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 374 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 375 | |     let data = input.data();
[INFO] [stdout] 376 | |     let total = h * w * channels;
[INFO] [stdout] ...   |
[INFO] [stdout] 501 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 502 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Applies zero-padded 3x3 Gaussian blur per channel.`
[INFO] [stdout]     = help: ends near `Applies zero-padded 3x3 Gaussian blur per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/filter.rs:622:1
[INFO] [stdout]     |
[INFO] [stdout] 622 | / pub fn gaussian_blur_5x5(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 623 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 624 | |     let data = input.data();
[INFO] [stdout] 625 | |     let k: [f32; 5] = [1.0 / 16.0, 4.0 / 16.0, 6.0 / 16.0, 4.0 / 16.0, 1.0 / 16.0];
[INFO] [stdout] ...   |
[INFO] [stdout] 669 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 670 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `5x5 Gaussian blur (sigma approx 1.0). Input: `[H, W]` or `[H, W, C]` f32.`
[INFO] [stdout]     = help: ends near `Applies zero-padded 5x5 Gaussian blur per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/filter.rs:622:1
[INFO] [stdout]     |
[INFO] [stdout] 622 | / pub fn gaussian_blur_5x5(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 623 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 624 | |     let data = input.data();
[INFO] [stdout] 625 | |     let k: [f32; 5] = [1.0 / 16.0, 4.0 / 16.0, 6.0 / 16.0, 4.0 / 16.0, 1.0 / 16.0];
[INFO] [stdout] ...   |
[INFO] [stdout] 669 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 670 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Applies zero-padded 5x5 Gaussian blur per channel.`
[INFO] [stdout]     = help: ends near `Applies zero-padded 5x5 Gaussian blur per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/features.rs:685:1
[INFO] [stdout]     |
[INFO] [stdout] 685 | / pub fn gaussian_pyramid(input: &Tensor, levels: usize) -> Result<Vec<Tensor>, ImgProcError> {
[INFO] [stdout] 686 | |     let mut pyramid = Vec::with_capacity(levels + 1);
[INFO] [stdout] 687 | |     pyramid.push(input.clone());
[INFO] [stdout] ...   |
[INFO] [stdout] 718 | |     Ok(pyramid)
[INFO] [stdout] 719 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Gaussian image pyramid (successive half-resolution blurred images).`
[INFO] [stdout]     = help: ends near `Builds a Gaussian image pyramid by repeated 2x downsampling.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/features.rs:685:1
[INFO] [stdout]     |
[INFO] [stdout] 685 | / pub fn gaussian_pyramid(input: &Tensor, levels: usize) -> Result<Vec<Tensor>, ImgProcError> {
[INFO] [stdout] 686 | |     let mut pyramid = Vec::with_capacity(levels + 1);
[INFO] [stdout] 687 | |     pyramid.push(input.clone());
[INFO] [stdout] ...   |
[INFO] [stdout] 718 | |     Ok(pyramid)
[INFO] [stdout] 719 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Builds a Gaussian image pyramid by repeated 2x downsampling.`
[INFO] [stdout]     = help: ends near `Builds a Gaussian image pyramid by repeated 2x downsampling.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1717:1
[INFO] [stdout]      |
[INFO] [stdout] 1717 | / pub fn good_features_to_track(
[INFO] [stdout] 1718 | |     img: &Tensor,
[INFO] [stdout] 1719 | |     max_corners: usize,
[INFO] [stdout] 1720 | |     quality_level: f32,
[INFO] [stdout] ...    |
[INFO] [stdout] 1806 | |     Ok(selected)
[INFO] [stdout] 1807 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Shi-Tomasi / Good Features to Track corner detector.`
[INFO] [stdout]      = help: ends near `Shi-Tomasi corner detection (minimum eigenvalue approach).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1717:1
[INFO] [stdout]      |
[INFO] [stdout] 1717 | / pub fn good_features_to_track(
[INFO] [stdout] 1718 | |     img: &Tensor,
[INFO] [stdout] 1719 | |     max_corners: usize,
[INFO] [stdout] 1720 | |     quality_level: f32,
[INFO] [stdout] ...    |
[INFO] [stdout] 1806 | |     Ok(selected)
[INFO] [stdout] 1807 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Shi-Tomasi corner detection (minimum eigenvalue approach).`
[INFO] [stdout]      = help: ends near `Shi-Tomasi corner detection (minimum eigenvalue approach).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/brief.rs:163:1
[INFO] [stdout]     |
[INFO] [stdout] 163 | / pub fn hamming_distance(a: &BriefDescriptor, b: &BriefDescriptor) -> u32 {
[INFO] [stdout] 164 | |     a.bits
[INFO] [stdout] 165 | |         .iter()
[INFO] [stdout] 166 | |         .zip(b.bits.iter())
[INFO] [stdout] 167 | |         .map(|(&x, &y)| (x ^ y).count_ones())
[INFO] [stdout] 168 | |         .sum()
[INFO] [stdout] 169 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Hamming distance between two binary descriptors.`
[INFO] [stdout]     = help: ends near `Hamming distance between two BRIEF descriptors.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/brief.rs:163:1
[INFO] [stdout]     |
[INFO] [stdout] 163 | / pub fn hamming_distance(a: &BriefDescriptor, b: &BriefDescriptor) -> u32 {
[INFO] [stdout] 164 | |     a.bits
[INFO] [stdout] 165 | |         .iter()
[INFO] [stdout] 166 | |         .zip(b.bits.iter())
[INFO] [stdout] 167 | |         .map(|(&x, &y)| (x ^ y).count_ones())
[INFO] [stdout] 168 | |         .sum()
[INFO] [stdout] 169 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Hamming distance between two BRIEF descriptors.`
[INFO] [stdout]     = help: ends near `Hamming distance between two BRIEF descriptors.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/features.rs:28:1
[INFO] [stdout]     |
[INFO] [stdout]  28 | / pub fn harris_corners(
[INFO] [stdout]  29 | |     input: &Tensor,
[INFO] [stdout]  30 | |     block_size: usize,
[INFO] [stdout]  31 | |     k: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 178 | |     Ok(corners)
[INFO] [stdout] 179 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Harris corner detector. Input: `[H, W]` grayscale f32.`
[INFO] [stdout]     = help: ends near `Harris corner detector on a single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/features.rs:28:1
[INFO] [stdout]     |
[INFO] [stdout]  28 | / pub fn harris_corners(
[INFO] [stdout]  29 | |     input: &Tensor,
[INFO] [stdout]  30 | |     block_size: usize,
[INFO] [stdout]  31 | |     k: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 178 | |     Ok(corners)
[INFO] [stdout] 179 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Harris corner detector on a single-channel `[H, W, 1]` image.`
[INFO] [stdout]     = help: ends near `Harris corner detector on a single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/histogram.rs:8:1
[INFO] [stdout]    |
[INFO] [stdout]  8 | / pub fn histogram_256(input: &Tensor) -> Result<[u32; 256], ImgProcError> {
[INFO] [stdout]  9 | |     let (_h, _w, c) = hwc_shape(input)?;
[INFO] [stdout] 10 | |     if c != 1 {
[INFO] [stdout] 11 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...  |
[INFO] [stdout] 57 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Compute 256-bin grayscale histogram. Input: `[H, W]` f32 with values in [0, 255].`
[INFO] [stdout]    = help: ends near `Assumes values in `[0, 1]` range.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/histogram.rs:8:1
[INFO] [stdout]    |
[INFO] [stdout]  8 | / pub fn histogram_256(input: &Tensor) -> Result<[u32; 256], ImgProcError> {
[INFO] [stdout]  9 | |     let (_h, _w, c) = hwc_shape(input)?;
[INFO] [stdout] 10 | |     if c != 1 {
[INFO] [stdout] 11 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...  |
[INFO] [stdout] 57 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Computes a 256-bin histogram for a single-channel `[H, W, 1]` image.`
[INFO] [stdout]    = help: ends near `Computes a 256-bin histogram for a single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/histogram.rs:114:1
[INFO] [stdout]     |
[INFO] [stdout] 114 | / pub fn histogram_equalize(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 115 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 116 | |     if c != 1 {
[INFO] [stdout] 117 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 143 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 144 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Histogram equalization. Input: `[H, W]` grayscale.`
[INFO] [stdout]     = help: ends near `Histogram equalization for single-channel `[H, W, 1]` images with values in `[0, 1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/histogram.rs:114:1
[INFO] [stdout]     |
[INFO] [stdout] 114 | / pub fn histogram_equalize(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 115 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 116 | |     if c != 1 {
[INFO] [stdout] 117 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 143 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 144 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Histogram equalization for single-channel `[H, W, 1]` images with values in `[0, 1]`.`
[INFO] [stdout]     = help: ends near `Histogram equalization for single-channel `[H, W, 1]` images with values in `[0, 1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1931:1
[INFO] [stdout]      |
[INFO] [stdout] 1931 | / pub fn hog_cell_descriptor(cell: &Tensor) -> Result<Vec<f32>, ImgProcError> {
[INFO] [stdout] 1932 | |     let (ch, cw, cc) = hwc_shape(cell)?;
[INFO] [stdout] 1933 | |     if cc != 1 {
[INFO] [stdout] 1934 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1956 | |     Ok(bins.iter().map(|v| v / norm).collect())
[INFO] [stdout] 1957 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `HOG (Histogram of Oriented Gradients) cell descriptor.`
[INFO] [stdout]      = help: ends near `Histogram of Oriented Gradients (HOG) descriptor for a single cell.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1931:1
[INFO] [stdout]      |
[INFO] [stdout] 1931 | / pub fn hog_cell_descriptor(cell: &Tensor) -> Result<Vec<f32>, ImgProcError> {
[INFO] [stdout] 1932 | |     let (ch, cw, cc) = hwc_shape(cell)?;
[INFO] [stdout] 1933 | |     if cc != 1 {
[INFO] [stdout] 1934 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1956 | |     Ok(bins.iter().map(|v| v / norm).collect())
[INFO] [stdout] 1957 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Histogram of Oriented Gradients (HOG) descriptor for a single cell.`
[INFO] [stdout]      = help: ends near `Histogram of Oriented Gradients (HOG) descriptor for a single cell.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:264:1
[INFO] [stdout]     |
[INFO] [stdout] 264 | / pub fn homography_4pt(
[INFO] [stdout] 265 | |     src: &[(f32, f32); 4],
[INFO] [stdout] 266 | |     dst: &[(f32, f32); 4],
[INFO] [stdout] 267 | | ) -> Result<[f32; 9], ImgProcError> {
[INFO] [stdout] ...   |
[INFO] [stdout] 294 | |     ])
[INFO] [stdout] 295 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Compute 4-point homography (direct linear transform).`
[INFO] [stdout]     = help: ends near `using the Direct Linear Transform (DLT) algorithm.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:264:1
[INFO] [stdout]     |
[INFO] [stdout] 264 | / pub fn homography_4pt(
[INFO] [stdout] 265 | |     src: &[(f32, f32); 4],
[INFO] [stdout] 266 | |     dst: &[(f32, f32); 4],
[INFO] [stdout] 267 | | ) -> Result<[f32; 9], ImgProcError> {
[INFO] [stdout] ...   |
[INFO] [stdout] 294 | |     ])
[INFO] [stdout] 295 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Computes a 3x3 homography matrix from 4 source/destination point correspondences`
[INFO] [stdout]     = help: ends near `Computes a 3x3 homography matrix from 4 source/destination point correspondences`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:2232:1
[INFO] [stdout]      |
[INFO] [stdout] 2232 | / pub fn hough_circles(
[INFO] [stdout] 2233 | |     img: &Tensor,
[INFO] [stdout] 2234 | |     min_radius: usize,
[INFO] [stdout] 2235 | |     max_radius: usize,
[INFO] [stdout] ...    |
[INFO] [stdout] 2334 | |     Ok(circles)
[INFO] [stdout] 2335 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Hough circle detection. Input: `[H, W]` edge/binary image.`
[INFO] [stdout]      = help: ends near `Hough circle transform on a binary/edge single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:2232:1
[INFO] [stdout]      |
[INFO] [stdout] 2232 | / pub fn hough_circles(
[INFO] [stdout] 2233 | |     img: &Tensor,
[INFO] [stdout] 2234 | |     min_radius: usize,
[INFO] [stdout] 2235 | |     max_radius: usize,
[INFO] [stdout] ...    |
[INFO] [stdout] 2334 | |     Ok(circles)
[INFO] [stdout] 2335 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Hough circle transform on a binary/edge single-channel `[H, W, 1]` image.`
[INFO] [stdout]      = help: ends near `Hough circle transform on a binary/edge single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/features.rs:621:1
[INFO] [stdout]     |
[INFO] [stdout] 621 | / pub fn hough_lines(
[INFO] [stdout] 622 | |     input: &Tensor,
[INFO] [stdout] 623 | |     rho_resolution: f32,
[INFO] [stdout] 624 | |     theta_resolution: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 676 | |     Ok(lines)
[INFO] [stdout] 677 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Hough line detection. Input: `[H, W]` edge/binary image.`
[INFO] [stdout]     = help: ends near `Standard Hough line transform on a binary/edge single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/features.rs:621:1
[INFO] [stdout]     |
[INFO] [stdout] 621 | / pub fn hough_lines(
[INFO] [stdout] 622 | |     input: &Tensor,
[INFO] [stdout] 623 | |     rho_resolution: f32,
[INFO] [stdout] 624 | |     theta_resolution: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 676 | |     Ok(lines)
[INFO] [stdout] 677 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Standard Hough line transform on a binary/edge single-channel `[H, W, 1]` image.`
[INFO] [stdout]     = help: ends near `Standard Hough line transform on a binary/edge single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/color.rs:663:1
[INFO] [stdout]     |
[INFO] [stdout] 663 | / pub fn hsv_to_rgb(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 664 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 665 | |     if c != 3 {
[INFO] [stdout] 666 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 702 | |     Tensor::from_vec(vec![h, w, 3], out).map_err(Into::into)
[INFO] [stdout] 703 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Convert HSV to RGB. Input/output: `[H, W, 3]` f32.`
[INFO] [stdout]     = help: ends near `Expects H in `[0, 1]`, S in `[0, 1]`, V in `[0, 1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/color.rs:663:1
[INFO] [stdout]     |
[INFO] [stdout] 663 | / pub fn hsv_to_rgb(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 664 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 665 | |     if c != 3 {
[INFO] [stdout] 666 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 702 | |     Tensor::from_vec(vec![h, w, 3], out).map_err(Into::into)
[INFO] [stdout] 703 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Converts HSV `[H, W, 3]` to RGB `[H, W, 3]`.`
[INFO] [stdout]     = help: ends near `Converts HSV `[H, W, 3]` to RGB `[H, W, 3]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/contours.rs:941:1
[INFO] [stdout]      |
[INFO] [stdout]  941 | / pub fn hu_moments(img: &Tensor) -> Result<[f64; 7], ImgProcError> {
[INFO] [stdout]  942 | |     let (h, w, c) = hwc_shape(img)?;
[INFO] [stdout]  943 | |     if c != 1 {
[INFO] [stdout]  944 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1013 | |     Ok([h1, h2, h3, h4, h5, h6, h7])
[INFO] [stdout] 1014 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Compute Hu's seven moment invariants from a binary/grayscale image.`
[INFO] [stdout]      = help: ends near `Computes the 7 Hu invariant moments from a single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/contours.rs:941:1
[INFO] [stdout]      |
[INFO] [stdout]  941 | / pub fn hu_moments(img: &Tensor) -> Result<[f64; 7], ImgProcError> {
[INFO] [stdout]  942 | |     let (h, w, c) = hwc_shape(img)?;
[INFO] [stdout]  943 | |     if c != 1 {
[INFO] [stdout]  944 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1013 | |     Ok([h1, h2, h3, h4, h5, h6, h7])
[INFO] [stdout] 1014 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Computes the 7 Hu invariant moments from a single-channel `[H, W, 1]` image.`
[INFO] [stdout]      = help: ends near `Computes the 7 Hu invariant moments from a single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/inpaint.rs:12:1
[INFO] [stdout]    |
[INFO] [stdout] 12 | / pub fn inpaint_telea(img: &Tensor, mask: &Tensor, radius: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 13 | |     let (h, w, channels) = hwc_shape(img)?;
[INFO] [stdout] 14 | |     let (mh, mw, mc) = hwc_shape(mask)?;
[INFO] [stdout] 15 | |     if mc != 1 {
[INFO] [stdout] ...  |
[INFO] [stdout] 82 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 83 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Inpaint missing regions using Telea's fast marching method.`
[INFO] [stdout]    = help: ends near `Telea-style fast marching inpainting.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/inpaint.rs:12:1
[INFO] [stdout]    |
[INFO] [stdout] 12 | / pub fn inpaint_telea(img: &Tensor, mask: &Tensor, radius: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 13 | |     let (h, w, channels) = hwc_shape(img)?;
[INFO] [stdout] 14 | |     let (mh, mw, mc) = hwc_shape(mask)?;
[INFO] [stdout] 15 | |     if mc != 1 {
[INFO] [stdout] ...  |
[INFO] [stdout] 82 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 83 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Telea-style fast marching inpainting.`
[INFO] [stdout]    = help: ends near `Telea-style fast marching inpainting.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/histogram.rs:152:1
[INFO] [stdout]     |
[INFO] [stdout] 152 | / pub fn integral_image(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 153 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 154 | |     if c != 1 {
[INFO] [stdout] 155 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 195 | |     Tensor::from_vec(vec![h, w, 1], sat).map_err(Into::into)
[INFO] [stdout] 196 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Compute integral image (summed area table). Input: `[H, W]`.`
[INFO] [stdout]     = help: ends near `Computes the integral (summed-area table) image from a `[H, W, 1]` tensor.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/histogram.rs:152:1
[INFO] [stdout]     |
[INFO] [stdout] 152 | / pub fn integral_image(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 153 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 154 | |     if c != 1 {
[INFO] [stdout] 155 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 195 | |     Tensor::from_vec(vec![h, w, 1], sat).map_err(Into::into)
[INFO] [stdout] 196 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Computes the integral (summed-area table) image from a `[H, W, 1]` tensor.`
[INFO] [stdout]     = help: ends near `Computes the integral (summed-area table) image from a `[H, W, 1]` tensor.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/color.rs:1265:1
[INFO] [stdout]      |
[INFO] [stdout] 1265 | / pub fn lab_to_rgb(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1266 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1267 | |     if c != 3 {
[INFO] [stdout] 1268 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1307 | |     Tensor::from_vec(vec![h, w, 3], out).map_err(Into::into)
[INFO] [stdout] 1308 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Convert CIE L*a*b* to RGB. Input/output: `[H, W, 3]`.`
[INFO] [stdout]      = help: ends near `Converts CIE LAB `[H, W, 3]` to RGB `[H, W, 3]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/color.rs:1265:1
[INFO] [stdout]      |
[INFO] [stdout] 1265 | / pub fn lab_to_rgb(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1266 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1267 | |     if c != 3 {
[INFO] [stdout] 1268 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1307 | |     Tensor::from_vec(vec![h, w, 3], out).map_err(Into::into)
[INFO] [stdout] 1308 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Converts CIE LAB `[H, W, 3]` to RGB `[H, W, 3]`.`
[INFO] [stdout]      = help: ends near `Converts CIE LAB `[H, W, 3]` to RGB `[H, W, 3]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/filter.rs:770:1
[INFO] [stdout]     |
[INFO] [stdout] 770 | / pub fn laplacian_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 771 | |     const KERNEL: [[f32; 3]; 3] = [[0.0, 1.0, 0.0], [1.0, -4.0, 1.0], [0.0, 1.0, 0.0]];
[INFO] [stdout] 772 | |     apply_kernel_3x3(input, &KERNEL)
[INFO] [stdout] 773 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 Laplacian filter. Input: `[H, W]` grayscale f32.`
[INFO] [stdout]     = help: ends near `Applies 3x3 Laplacian edge detection per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/filter.rs:770:1
[INFO] [stdout]     |
[INFO] [stdout] 770 | / pub fn laplacian_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 771 | |     const KERNEL: [[f32; 3]; 3] = [[0.0, 1.0, 0.0], [1.0, -4.0, 1.0], [0.0, 1.0, 0.0]];
[INFO] [stdout] 772 | |     apply_kernel_3x3(input, &KERNEL)
[INFO] [stdout] 773 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Applies 3x3 Laplacian edge detection per channel.`
[INFO] [stdout]     = help: ends near `Applies 3x3 Laplacian edge detection per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/flow.rs:327:1
[INFO] [stdout]     |
[INFO] [stdout] 327 | / pub fn lucas_kanade_optical_flow(
[INFO] [stdout] 328 | |     prev: &Tensor,
[INFO] [stdout] 329 | |     next: &Tensor,
[INFO] [stdout] 330 | |     points: &[(usize, usize)],
[INFO] [stdout] ...   |
[INFO] [stdout] 384 | |     Ok(flows)
[INFO] [stdout] 385 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Lucas-Kanade sparse optical flow.`
[INFO] [stdout]     = help: ends near `Sparse Lucas-Kanade optical flow between two grayscale `[H,W,1]` frames.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/flow.rs:327:1
[INFO] [stdout]     |
[INFO] [stdout] 327 | / pub fn lucas_kanade_optical_flow(
[INFO] [stdout] 328 | |     prev: &Tensor,
[INFO] [stdout] 329 | |     next: &Tensor,
[INFO] [stdout] 330 | |     points: &[(usize, usize)],
[INFO] [stdout] ...   |
[INFO] [stdout] 384 | |     Ok(flows)
[INFO] [stdout] 385 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Sparse Lucas-Kanade optical flow between two grayscale `[H,W,1]` frames.`
[INFO] [stdout]     = help: ends near `Sparse Lucas-Kanade optical flow between two grayscale `[H,W,1]` frames.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/orb.rs:152:1
[INFO] [stdout]     |
[INFO] [stdout] 152 | / pub fn match_features(
[INFO] [stdout] 153 | |     features_a: &[OrbFeature],
[INFO] [stdout] 154 | |     features_b: &[OrbFeature],
[INFO] [stdout] 155 | |     max_distance: u32,
[INFO] [stdout] ...   |
[INFO] [stdout] 172 | |     matches
[INFO] [stdout] 173 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Match feature descriptors between two sets by brute-force nearest neighbor.`
[INFO] [stdout]     = help: ends near `Match ORB features between two sets using brute-force Hamming distance.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/orb.rs:152:1
[INFO] [stdout]     |
[INFO] [stdout] 152 | / pub fn match_features(
[INFO] [stdout] 153 | |     features_a: &[OrbFeature],
[INFO] [stdout] 154 | |     features_b: &[OrbFeature],
[INFO] [stdout] 155 | |     max_distance: u32,
[INFO] [stdout] ...   |
[INFO] [stdout] 172 | |     matches
[INFO] [stdout] 173 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Match ORB features between two sets using brute-force Hamming distance.`
[INFO] [stdout]     = help: ends near `Match ORB features between two sets using brute-force Hamming distance.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/surf.rs:486:1
[INFO] [stdout]     |
[INFO] [stdout] 486 | / pub fn match_surf_descriptors(
[INFO] [stdout] 487 | |     desc1: &[SurfDescriptor],
[INFO] [stdout] 488 | |     desc2: &[SurfDescriptor],
[INFO] [stdout] 489 | |     ratio_threshold: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 520 | |     matches
[INFO] [stdout] 521 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Match two sets of SURF descriptors.`
[INFO] [stdout]     = help: ends near `Match SURF descriptors between two sets using nearest-neighbor ratio test.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/surf.rs:486:1
[INFO] [stdout]     |
[INFO] [stdout] 486 | / pub fn match_surf_descriptors(
[INFO] [stdout] 487 | |     desc1: &[SurfDescriptor],
[INFO] [stdout] 488 | |     desc2: &[SurfDescriptor],
[INFO] [stdout] 489 | |     ratio_threshold: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 520 | |     matches
[INFO] [stdout] 521 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Match SURF descriptors between two sets using nearest-neighbor ratio test.`
[INFO] [stdout]     = help: ends near `Match SURF descriptors between two sets using nearest-neighbor ratio test.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/filter.rs:819:1
[INFO] [stdout]     |
[INFO] [stdout] 819 | / pub fn median_blur_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 820 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 821 | |     let data = input.data();
[INFO] [stdout] 822 | |     let mut out = vec![0.0f32; h * w * channels];
[INFO] [stdout] ...   |
[INFO] [stdout] 869 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 870 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 median blur. Input: `[H, W]` or `[H, W, C]` f32.`
[INFO] [stdout]     = help: ends near `Applies 3x3 median filter per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/filter.rs:819:1
[INFO] [stdout]     |
[INFO] [stdout] 819 | / pub fn median_blur_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 820 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 821 | |     let data = input.data();
[INFO] [stdout] 822 | |     let mut out = vec![0.0f32; h * w * channels];
[INFO] [stdout] ...   |
[INFO] [stdout] 869 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 870 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Applies 3x3 median filter per channel.`
[INFO] [stdout]     = help: ends near `Applies 3x3 median filter per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/filter.rs:876:1
[INFO] [stdout]     |
[INFO] [stdout] 876 | / pub fn median_filter(input: &Tensor, kernel_size: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 877 | |     if kernel_size == 0 || kernel_size.is_multiple_of(2) {
[INFO] [stdout] 878 | |         return Err(ImgProcError::InvalidBlockSize {
[INFO] [stdout] 879 | |             block_size: kernel_size,
[INFO] [stdout] ...   |
[INFO] [stdout] 911 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 912 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Median filter with arbitrary window size.`
[INFO] [stdout]     = help: ends near `Applies NxN median filter on a single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/filter.rs:876:1
[INFO] [stdout]     |
[INFO] [stdout] 876 | / pub fn median_filter(input: &Tensor, kernel_size: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 877 | |     if kernel_size == 0 || kernel_size.is_multiple_of(2) {
[INFO] [stdout] 878 | |         return Err(ImgProcError::InvalidBlockSize {
[INFO] [stdout] 879 | |             block_size: kernel_size,
[INFO] [stdout] ...   |
[INFO] [stdout] 911 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 912 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Applies NxN median filter on a single-channel `[H, W, 1]` image.`
[INFO] [stdout]     = help: ends near `Applies NxN median filter on a single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:205:1
[INFO] [stdout]     |
[INFO] [stdout] 205 | / pub fn min_area_rect(points: &[(f32, f32)]) -> Option<(f32, f32, f32, f32, f32)> {
[INFO] [stdout] 206 | |     let hull = convex_hull(points);
[INFO] [stdout] 207 | |     if hull.len() < 2 {
[INFO] [stdout] 208 | |         return hull.first().map(|p| (p.0, p.1, 0.0, 0.0, 0.0));
[INFO] [stdout] ...   |
[INFO] [stdout] 256 | |     Some(best_rect)
[INFO] [stdout] 257 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Minimum area rotated rectangle of a set of 2D points.`
[INFO] [stdout]     = help: ends near `using the rotating calipers approach on the convex hull.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:205:1
[INFO] [stdout]     |
[INFO] [stdout] 205 | / pub fn min_area_rect(points: &[(f32, f32)]) -> Option<(f32, f32, f32, f32, f32)> {
[INFO] [stdout] 206 | |     let hull = convex_hull(points);
[INFO] [stdout] 207 | |     if hull.len() < 2 {
[INFO] [stdout] 208 | |         return hull.first().map(|p| (p.0, p.1, 0.0, 0.0, 0.0));
[INFO] [stdout] ...   |
[INFO] [stdout] 256 | |     Some(best_rect)
[INFO] [stdout] 257 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Computes the minimum-area bounding rectangle for a set of 2D points`
[INFO] [stdout]     = help: ends near `Computes the minimum-area bounding rectangle for a set of 2D points`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:766:1
[INFO] [stdout]     |
[INFO] [stdout] 766 | / pub fn min_enclosing_circle(points: &[(f32, f32)]) -> Option<((f32, f32), f32)> {
[INFO] [stdout] 767 | |     if points.is_empty() {
[INFO] [stdout] 768 | |         return None;
[INFO] [stdout] ...   |
[INFO] [stdout] 833 | |     Some(((circle.0.0 as f32, circle.0.1 as f32), circle.1 as f32))
[INFO] [stdout] 834 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Minimum enclosing circle of a 2D point set (Welzl, exact).`
[INFO] [stdout]     = help: ends near `Minimum enclosing circle of a point set (Welzl's algorithm, exact).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:766:1
[INFO] [stdout]     |
[INFO] [stdout] 766 | / pub fn min_enclosing_circle(points: &[(f32, f32)]) -> Option<((f32, f32), f32)> {
[INFO] [stdout] 767 | |     if points.is_empty() {
[INFO] [stdout] 768 | |         return None;
[INFO] [stdout] ...   |
[INFO] [stdout] 833 | |     Some(((circle.0.0 as f32, circle.0.1 as f32), circle.1 as f32))
[INFO] [stdout] 834 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Minimum enclosing circle of a point set (Welzl's algorithm, exact).`
[INFO] [stdout]     = help: ends near `Minimum enclosing circle of a point set (Welzl's algorithm, exact).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:992:1
[INFO] [stdout]      |
[INFO] [stdout]  992 | / pub fn morph_blackhat(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout]  993 | |     let closed = closing_3x3(input)?;
[INFO] [stdout]  994 | |     let mut out = vec![0.0f32; input.len()];
[INFO] [stdout]  995 | |     for (i, v) in out.iter_mut().enumerate() {
[INFO] [stdout] ...    |
[INFO] [stdout]  999 | |     Tensor::from_vec(vec![h, w, c], out).map_err(Into::into)
[INFO] [stdout] 1000 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Morphological black-hat transform (closing - input).`
[INFO] [stdout]      = help: ends near `Black-hat transform: `closing(input) - input`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:992:1
[INFO] [stdout]      |
[INFO] [stdout]  992 | / pub fn morph_blackhat(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout]  993 | |     let closed = closing_3x3(input)?;
[INFO] [stdout]  994 | |     let mut out = vec![0.0f32; input.len()];
[INFO] [stdout]  995 | |     for (i, v) in out.iter_mut().enumerate() {
[INFO] [stdout] ...    |
[INFO] [stdout]  999 | |     Tensor::from_vec(vec![h, w, c], out).map_err(Into::into)
[INFO] [stdout] 1000 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Black-hat transform: `closing(input) - input`.`
[INFO] [stdout]      = help: ends near `Black-hat transform: `closing(input) - input`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/morphology.rs:917:1
[INFO] [stdout]     |
[INFO] [stdout] 917 | / pub fn morph_gradient_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 918 | |     let dilated = dilate_3x3(input)?;
[INFO] [stdout] 919 | |     let eroded = erode_3x3(input)?;
[INFO] [stdout] ...   |
[INFO] [stdout] 927 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 928 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Morphological gradient (dilation - erosion) with 3x3 element.`
[INFO] [stdout]     = help: ends near `Applies a 3x3 morphological gradient (`dilate - erode`) per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/morphology.rs:917:1
[INFO] [stdout]     |
[INFO] [stdout] 917 | / pub fn morph_gradient_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 918 | |     let dilated = dilate_3x3(input)?;
[INFO] [stdout] 919 | |     let eroded = erode_3x3(input)?;
[INFO] [stdout] ...   |
[INFO] [stdout] 927 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 928 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Applies a 3x3 morphological gradient (`dilate - erode`) per channel.`
[INFO] [stdout]     = help: ends near `Applies a 3x3 morphological gradient (`dilate - erode`) per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/morphology.rs:979:1
[INFO] [stdout]     |
[INFO] [stdout] 979 | / pub fn morph_tophat(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 980 | |     let opened = opening_3x3(input)?;
[INFO] [stdout] 981 | |     let mut out = vec![0.0f32; input.len()];
[INFO] [stdout] 982 | |     for (i, v) in out.iter_mut().enumerate() {
[INFO] [stdout] ...   |
[INFO] [stdout] 986 | |     Tensor::from_vec(vec![h, w, c], out).map_err(Into::into)
[INFO] [stdout] 987 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Morphological top-hat transform (input - opening).`
[INFO] [stdout]     = help: ends near `Top-hat transform: `input - opening(input)`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/morphology.rs:979:1
[INFO] [stdout]     |
[INFO] [stdout] 979 | / pub fn morph_tophat(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 980 | |     let opened = opening_3x3(input)?;
[INFO] [stdout] 981 | |     let mut out = vec![0.0f32; input.len()];
[INFO] [stdout] 982 | |     for (i, v) in out.iter_mut().enumerate() {
[INFO] [stdout] ...   |
[INFO] [stdout] 986 | |     Tensor::from_vec(vec![h, w, c], out).map_err(Into::into)
[INFO] [stdout] 987 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Top-hat transform: `input - opening(input)`.`
[INFO] [stdout]     = help: ends near `Top-hat transform: `input - opening(input)`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/nms.rs:19:1
[INFO] [stdout]    |
[INFO] [stdout] 19 | / pub fn nms(boxes: &[BBox], iou_threshold: f32) -> Vec<usize> {
[INFO] [stdout] 20 | |     let mut indices: Vec<usize> = (0..boxes.len()).collect();
[INFO] [stdout] 21 | |     indices.sort_by(|&a, &b| {
[INFO] [stdout] 22 | |         boxes[b]
[INFO] [stdout] ...  |
[INFO] [stdout] 46 | |     keep
[INFO] [stdout] 47 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Non-maximum suppression on bounding boxes by IoU threshold.`
[INFO] [stdout]    = help: ends near `Greedy non-maximum suppression on bounding boxes.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/nms.rs:19:1
[INFO] [stdout]    |
[INFO] [stdout] 19 | / pub fn nms(boxes: &[BBox], iou_threshold: f32) -> Vec<usize> {
[INFO] [stdout] 20 | |     let mut indices: Vec<usize> = (0..boxes.len()).collect();
[INFO] [stdout] 21 | |     indices.sort_by(|&a, &b| {
[INFO] [stdout] 22 | |         boxes[b]
[INFO] [stdout] ...  |
[INFO] [stdout] 46 | |     keep
[INFO] [stdout] 47 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Greedy non-maximum suppression on bounding boxes.`
[INFO] [stdout]    = help: ends near `Greedy non-maximum suppression on bounding boxes.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/normalize.rs:14:1
[INFO] [stdout]    |
[INFO] [stdout] 14 | / pub fn normalize(input: &Tensor, mean: &[f32], std: &[f32]) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 15 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 16 | |     if mean.len() != channels || std.len() != channels {
[INFO] [stdout] 17 | |         return Err(ImgProcError::InvalidNormalizationParams {
[INFO] [stdout] ...  |
[INFO] [stdout] 57 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 58 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Normalize image channels: `(pixel - mean) / std`. Input: `[H, W, C]` f32.`
[INFO] [stdout]    = help: ends near `Per-channel normalize in HWC layout: `(x - mean[c]) / std[c]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/normalize.rs:14:1
[INFO] [stdout]    |
[INFO] [stdout] 14 | / pub fn normalize(input: &Tensor, mean: &[f32], std: &[f32]) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 15 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 16 | |     if mean.len() != channels || std.len() != channels {
[INFO] [stdout] 17 | |         return Err(ImgProcError::InvalidNormalizationParams {
[INFO] [stdout] ...  |
[INFO] [stdout] 57 | |     Tensor::from_vec(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 58 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Per-channel normalize in HWC layout: `(x - mean[c]) / std[c]`.`
[INFO] [stdout]    = help: ends near `Per-channel normalize in HWC layout: `(x - mean[c]) / std[c]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/morphology.rs:905:1
[INFO] [stdout]     |
[INFO] [stdout] 905 | / pub fn opening_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 906 | |     let eroded = erode_3x3(input)?;
[INFO] [stdout] 907 | |     dilate_3x3(&eroded)
[INFO] [stdout] 908 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Morphological opening (erode then dilate) with 3x3 structuring element.`
[INFO] [stdout]     = help: ends near `Applies a 3x3 opening (`erode` followed by `dilate`) per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/morphology.rs:905:1
[INFO] [stdout]     |
[INFO] [stdout] 905 | / pub fn opening_3x3(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 906 | |     let eroded = erode_3x3(input)?;
[INFO] [stdout] 907 | |     dilate_3x3(&eroded)
[INFO] [stdout] 908 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Applies a 3x3 opening (`erode` followed by `dilate`) per channel.`
[INFO] [stdout]     = help: ends near `Applies a 3x3 opening (`erode` followed by `dilate`) per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1635:1
[INFO] [stdout]      |
[INFO] [stdout] 1635 | / pub fn orb_descriptors(
[INFO] [stdout] 1636 | |     image: &Tensor,
[INFO] [stdout] 1637 | |     keypoints: &[(usize, usize)],
[INFO] [stdout] 1638 | |     patch_radius: usize,
[INFO] [stdout] ...    |
[INFO] [stdout] 1671 | |     Ok(descriptors)
[INFO] [stdout] 1672 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Compute ORB descriptors at given keypoints.`
[INFO] [stdout]      = help: ends near `Computes ORB descriptors for keypoints on a grayscale `[H,W,1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1635:1
[INFO] [stdout]      |
[INFO] [stdout] 1635 | / pub fn orb_descriptors(
[INFO] [stdout] 1636 | |     image: &Tensor,
[INFO] [stdout] 1637 | |     keypoints: &[(usize, usize)],
[INFO] [stdout] 1638 | |     patch_radius: usize,
[INFO] [stdout] ...    |
[INFO] [stdout] 1671 | |     Ok(descriptors)
[INFO] [stdout] 1672 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Computes ORB descriptors for keypoints on a grayscale `[H,W,1]` image.`
[INFO] [stdout]      = help: ends near `Computes ORB descriptors for keypoints on a grayscale `[H,W,1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1675:1
[INFO] [stdout]      |
[INFO] [stdout] 1675 | / pub fn orb_hamming_distance(a: &OrbDescriptor, b: &OrbDescriptor) -> u32 {
[INFO] [stdout] 1676 | |     a.bits
[INFO] [stdout] 1677 | |         .iter()
[INFO] [stdout] 1678 | |         .zip(b.bits.iter())
[INFO] [stdout] 1679 | |         .map(|(&x, &y)| (x ^ y).count_ones())
[INFO] [stdout] 1680 | |         .sum()
[INFO] [stdout] 1681 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Hamming distance between two ORB descriptors.`
[INFO] [stdout]      = help: ends near `Hamming distance between two ORB descriptors.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1684:1
[INFO] [stdout]      |
[INFO] [stdout] 1684 | / pub fn orb_match(
[INFO] [stdout] 1685 | |     desc_a: &[OrbDescriptor],
[INFO] [stdout] 1686 | |     desc_b: &[OrbDescriptor],
[INFO] [stdout] 1687 | |     max_distance: u32,
[INFO] [stdout] ...    |
[INFO] [stdout] 1704 | |     matches
[INFO] [stdout] 1705 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Match ORB features between two sets.`
[INFO] [stdout]      = help: ends near `Brute-force ORB descriptor matching. Returns `(idx_a, idx_b, distance)`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1684:1
[INFO] [stdout]      |
[INFO] [stdout] 1684 | / pub fn orb_match(
[INFO] [stdout] 1685 | |     desc_a: &[OrbDescriptor],
[INFO] [stdout] 1686 | |     desc_b: &[OrbDescriptor],
[INFO] [stdout] 1687 | |     max_distance: u32,
[INFO] [stdout] ...    |
[INFO] [stdout] 1704 | |     matches
[INFO] [stdout] 1705 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Brute-force ORB descriptor matching. Returns `(idx_a, idx_b, distance)`.`
[INFO] [stdout]      = help: ends near `Brute-force ORB descriptor matching. Returns `(idx_a, idx_b, distance)`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:675:1
[INFO] [stdout]     |
[INFO] [stdout] 675 | / pub fn pad_constant(
[INFO] [stdout] 676 | |     input: &Tensor,
[INFO] [stdout] 677 | |     pad_top: usize,
[INFO] [stdout] 678 | |     pad_bottom: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 698 | |     Tensor::from_vec(vec![out_h, out_w, channels], out).map_err(Into::into)
[INFO] [stdout] 699 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Pad image borders with a constant value.`
[INFO] [stdout]     = help: ends near `Pads an HWC tensor with a constant value on all sides.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:675:1
[INFO] [stdout]     |
[INFO] [stdout] 675 | / pub fn pad_constant(
[INFO] [stdout] 676 | |     input: &Tensor,
[INFO] [stdout] 677 | |     pad_top: usize,
[INFO] [stdout] 678 | |     pad_bottom: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 698 | |     Tensor::from_vec(vec![out_h, out_w, channels], out).map_err(Into::into)
[INFO] [stdout] 699 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Pads an HWC tensor with a constant value on all sides.`
[INFO] [stdout]     = help: ends near `Pads an HWC tensor with a constant value on all sides.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/calibration.rs:82:1
[INFO] [stdout]     |
[INFO] [stdout]  82 | / pub fn project_points(
[INFO] [stdout]  83 | |     points_3d: &[(f32, f32, f32)],
[INFO] [stdout]  84 | |     intrinsics: &CameraIntrinsics,
[INFO] [stdout]  85 | | ) -> Vec<(f32, f32)> {
[INFO] [stdout] ...   |
[INFO] [stdout] 110 | |         .collect()
[INFO] [stdout] 111 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Project 3D points to 2D using camera intrinsics.`
[INFO] [stdout]     = help: ends near `(no extrinsic rotation/translation — assumes camera-frame coordinates).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/calibration.rs:82:1
[INFO] [stdout]     |
[INFO] [stdout]  82 | / pub fn project_points(
[INFO] [stdout]  83 | |     points_3d: &[(f32, f32, f32)],
[INFO] [stdout]  84 | |     intrinsics: &CameraIntrinsics,
[INFO] [stdout]  85 | | ) -> Vec<(f32, f32)> {
[INFO] [stdout] ...   |
[INFO] [stdout] 110 | |         .collect()
[INFO] [stdout] 111 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Project 3-D world points to 2-D pixel coordinates using a pinhole camera model`
[INFO] [stdout]     = help: ends near `Project 3-D world points to 2-D pixel coordinates using a pinhole camera model`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:348:1
[INFO] [stdout]     |
[INFO] [stdout] 348 | / pub fn ransac_homography(
[INFO] [stdout] 349 | |     src: &[(f32, f32)],
[INFO] [stdout] 350 | |     dst: &[(f32, f32)],
[INFO] [stdout] 351 | |     iterations: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 416 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Estimate homography via RANSAC.`
[INFO] [stdout]     = help: ends near `RANSAC-based homography estimation from point correspondences.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:348:1
[INFO] [stdout]     |
[INFO] [stdout] 348 | / pub fn ransac_homography(
[INFO] [stdout] 349 | |     src: &[(f32, f32)],
[INFO] [stdout] 350 | |     dst: &[(f32, f32)],
[INFO] [stdout] 351 | |     iterations: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 416 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `RANSAC-based homography estimation from point correspondences.`
[INFO] [stdout]     = help: ends near `RANSAC-based homography estimation from point correspondences.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:841:1
[INFO] [stdout]     |
[INFO] [stdout] 841 | / pub fn region_props(labels: &Tensor) -> Result<Vec<RegionProp>, ImgProcError> {
[INFO] [stdout] 842 | |     let (h, w, c) = hwc_shape(labels)?;
[INFO] [stdout] 843 | |     if c != 1 {
[INFO] [stdout] 844 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 934 | |     Ok(props)
[INFO] [stdout] 935 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Compute region properties (area, centroid, bbox) from a labeled image.`
[INFO] [stdout]     = help: ends near `Compute region properties from a label image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/contours.rs:841:1
[INFO] [stdout]     |
[INFO] [stdout] 841 | / pub fn region_props(labels: &Tensor) -> Result<Vec<RegionProp>, ImgProcError> {
[INFO] [stdout] 842 | |     let (h, w, c) = hwc_shape(labels)?;
[INFO] [stdout] 843 | |     if c != 1 {
[INFO] [stdout] 844 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 934 | |     Ok(props)
[INFO] [stdout] 935 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Compute region properties from a label image.`
[INFO] [stdout]     = help: ends near `Compute region properties from a label image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:1115:1
[INFO] [stdout]      |
[INFO] [stdout] 1115 | / pub fn remove_small_objects(input: &Tensor, min_size: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1116 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1117 | |     if c != 1 {
[INFO] [stdout] 1118 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1164 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 1165 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Remove small connected components below a size threshold.`
[INFO] [stdout]      = help: ends near `Removes connected components with area less than `min_size`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:1115:1
[INFO] [stdout]      |
[INFO] [stdout] 1115 | / pub fn remove_small_objects(input: &Tensor, min_size: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1116 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1117 | |     if c != 1 {
[INFO] [stdout] 1118 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1164 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 1165 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Removes connected components with area less than `min_size`.`
[INFO] [stdout]      = help: ends near `Removes connected components with area less than `min_size`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/resize.rs:187:1
[INFO] [stdout]     |
[INFO] [stdout] 187 | / pub fn resize_bilinear(input: &Tensor, out_h: usize, out_w: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 188 | |     resize_bilinear_luts(input, out_h, out_w, bilinear_lut_corners)
[INFO] [stdout] 189 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Resize using bilinear interpolation. Input: `[H, W, C]` or `[H, W]` f32.`
[INFO] [stdout]     = help: ends near `Resizes HWC tensor with bilinear interpolation (corner-aligned sampling).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/resize.rs:187:1
[INFO] [stdout]     |
[INFO] [stdout] 187 | / pub fn resize_bilinear(input: &Tensor, out_h: usize, out_w: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 188 | |     resize_bilinear_luts(input, out_h, out_w, bilinear_lut_corners)
[INFO] [stdout] 189 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Resizes HWC tensor with bilinear interpolation (corner-aligned sampling).`
[INFO] [stdout]     = help: ends near `Resizes HWC tensor with bilinear interpolation (corner-aligned sampling).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/resize.rs:11:1
[INFO] [stdout]     |
[INFO] [stdout]  11 | / pub fn resize_nearest(input: &Tensor, out_h: usize, out_w: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout]  12 | |     let (in_h, in_w, channels) = hwc_shape(input)?;
[INFO] [stdout]  13 | |     if out_h == 0 || out_w == 0 {
[INFO] [stdout]  14 | |         return Err(ImgProcError::InvalidSize {
[INFO] [stdout] ...   |
[INFO] [stdout] 148 | |     Tensor::from_vec(vec![out_h, out_w, channels], out).map_err(Into::into)
[INFO] [stdout] 149 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Resize using nearest-neighbor interpolation. Input: `[H, W, C]` or `[H, W]` f32.`
[INFO] [stdout]     = help: ends near `Resizes HWC tensor with nearest-neighbor sampling.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/resize.rs:11:1
[INFO] [stdout]     |
[INFO] [stdout]  11 | / pub fn resize_nearest(input: &Tensor, out_h: usize, out_w: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout]  12 | |     let (in_h, in_w, channels) = hwc_shape(input)?;
[INFO] [stdout]  13 | |     if out_h == 0 || out_w == 0 {
[INFO] [stdout]  14 | |         return Err(ImgProcError::InvalidSize {
[INFO] [stdout] ...   |
[INFO] [stdout] 148 | |     Tensor::from_vec(vec![out_h, out_w, channels], out).map_err(Into::into)
[INFO] [stdout] 149 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Resizes HWC tensor with nearest-neighbor sampling.`
[INFO] [stdout]     = help: ends near `Resizes HWC tensor with nearest-neighbor sampling.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/color.rs:1721:1
[INFO] [stdout]      |
[INFO] [stdout] 1721 | / pub fn rgb_to_bgr(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1722 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1723 | |     if c != 3 {
[INFO] [stdout] 1724 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1789 | |     Tensor::from_aligned(vec![h, w, 3], out).map_err(Into::into)
[INFO] [stdout] 1790 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Convert RGB to BGR channel order. Input/output: `[H, W, 3]`.`
[INFO] [stdout]      = help: ends near `Converts RGB `[H, W, 3]` to BGR `[H, W, 3]` (channel swap).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/color.rs:1721:1
[INFO] [stdout]      |
[INFO] [stdout] 1721 | / pub fn rgb_to_bgr(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1722 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1723 | |     if c != 3 {
[INFO] [stdout] 1724 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1789 | |     Tensor::from_aligned(vec![h, w, 3], out).map_err(Into::into)
[INFO] [stdout] 1790 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Converts RGB `[H, W, 3]` to BGR `[H, W, 3]` (channel swap).`
[INFO] [stdout]      = help: ends near `Converts RGB `[H, W, 3]` to BGR `[H, W, 3]` (channel swap).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/color.rs:16:1
[INFO] [stdout]    |
[INFO] [stdout] 16 | / pub fn rgb_to_grayscale(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 17 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 18 | |     if c != 3 {
[INFO] [stdout] 19 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...  |
[INFO] [stdout] 73 | |     Tensor::from_aligned(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 74 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Convert RGB to grayscale using ITU-R BT.601 luminance weights.`
[INFO] [stdout]    = help: ends near `Converts RGB image `[H, W, 3]` to grayscale `[H, W, 1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/color.rs:16:1
[INFO] [stdout]    |
[INFO] [stdout] 16 | / pub fn rgb_to_grayscale(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 17 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 18 | |     if c != 3 {
[INFO] [stdout] 19 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...  |
[INFO] [stdout] 73 | |     Tensor::from_aligned(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 74 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Converts RGB image `[H, W, 3]` to grayscale `[H, W, 1]`.`
[INFO] [stdout]    = help: ends near `Converts RGB image `[H, W, 3]` to grayscale `[H, W, 1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/color.rs:257:1
[INFO] [stdout]     |
[INFO] [stdout] 257 | / pub fn rgb_to_hsv(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 258 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 259 | |     if c != 3 {
[INFO] [stdout] 260 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 357 | |     Tensor::from_aligned(vec![h, w, 3], out).map_err(Into::into)
[INFO] [stdout] 358 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Convert RGB to HSV color space. Input/output: `[H, W, 3]` f32.`
[INFO] [stdout]     = help: ends near `H is in `[0, 1]` (scaled from [0, 360]), S and V are in `[0, 1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/color.rs:257:1
[INFO] [stdout]     |
[INFO] [stdout] 257 | / pub fn rgb_to_hsv(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 258 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 259 | |     if c != 3 {
[INFO] [stdout] 260 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 357 | |     Tensor::from_aligned(vec![h, w, 3], out).map_err(Into::into)
[INFO] [stdout] 358 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Converts RGB `[H, W, 3]` to HSV `[H, W, 3]`.`
[INFO] [stdout]     = help: ends near `Converts RGB `[H, W, 3]` to HSV `[H, W, 3]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/color.rs:738:1
[INFO] [stdout]     |
[INFO] [stdout] 738 | / pub fn rgb_to_lab(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 739 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 740 | |     if c != 3 {
[INFO] [stdout] 741 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 888 | |     Tensor::from_aligned(vec![h, w, 3], out).map_err(Into::into)
[INFO] [stdout] 889 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Convert RGB to CIE L*a*b*. Input/output: `[H, W, 3]`.`
[INFO] [stdout]     = help: ends near `Converts RGB `[H, W, 3]` to CIE LAB `[H, W, 3]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/color.rs:738:1
[INFO] [stdout]     |
[INFO] [stdout] 738 | / pub fn rgb_to_lab(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 739 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 740 | |     if c != 3 {
[INFO] [stdout] 741 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 888 | |     Tensor::from_aligned(vec![h, w, 3], out).map_err(Into::into)
[INFO] [stdout] 889 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Converts RGB `[H, W, 3]` to CIE LAB `[H, W, 3]`.`
[INFO] [stdout]     = help: ends near `Converts RGB `[H, W, 3]` to CIE LAB `[H, W, 3]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/color.rs:1314:1
[INFO] [stdout]      |
[INFO] [stdout] 1314 | / pub fn rgb_to_yuv(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1315 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1316 | |     if c != 3 {
[INFO] [stdout] 1317 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1391 | |     Tensor::from_aligned(vec![h, w, 3], out).map_err(Into::into)
[INFO] [stdout] 1392 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Convert RGB to YUV. Input/output: `[H, W, 3]`.`
[INFO] [stdout]      = help: ends near `Converts RGB `[H, W, 3]` to YUV `[H, W, 3]` using BT.601 coefficients.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/color.rs:1314:1
[INFO] [stdout]      |
[INFO] [stdout] 1314 | / pub fn rgb_to_yuv(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1315 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1316 | |     if c != 3 {
[INFO] [stdout] 1317 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1391 | |     Tensor::from_aligned(vec![h, w, 3], out).map_err(Into::into)
[INFO] [stdout] 1392 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Converts RGB `[H, W, 3]` to YUV `[H, W, 3]` using BT.601 coefficients.`
[INFO] [stdout]      = help: ends near `Converts RGB `[H, W, 3]` to YUV `[H, W, 3]` using BT.601 coefficients.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:654:1
[INFO] [stdout]     |
[INFO] [stdout] 654 | / pub fn rotate90_cw(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 655 | |     let (in_h, in_w, channels) = hwc_shape(input)?;
[INFO] [stdout] 656 | |     let out_h = in_w;
[INFO] [stdout] 657 | |     let out_w = in_h;
[INFO] [stdout] ...   |
[INFO] [stdout] 671 | |     Tensor::from_vec(vec![out_h, out_w, channels], out).map_err(Into::into)
[INFO] [stdout] 672 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Rotate image 90 degrees clockwise.`
[INFO] [stdout]     = help: ends near `Rotates an HWC tensor 90 degrees clockwise.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:654:1
[INFO] [stdout]     |
[INFO] [stdout] 654 | / pub fn rotate90_cw(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 655 | |     let (in_h, in_w, channels) = hwc_shape(input)?;
[INFO] [stdout] 656 | |     let out_h = in_w;
[INFO] [stdout] 657 | |     let out_w = in_h;
[INFO] [stdout] ...   |
[INFO] [stdout] 671 | |     Tensor::from_vec(vec![out_h, out_w, channels], out).map_err(Into::into)
[INFO] [stdout] 672 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Rotates an HWC tensor 90 degrees clockwise.`
[INFO] [stdout]     = help: ends near `Rotates an HWC tensor 90 degrees clockwise.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:490:1
[INFO] [stdout]     |
[INFO] [stdout] 490 | / pub fn scharr_3x3_gradients(input: &Tensor) -> Result<(Tensor, Tensor), ImgProcError> {
[INFO] [stdout] 491 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 492 | |     let len = h * w * channels;
[INFO] [stdout] 493 | |     let mut out_gx = vec![0.0f32; len];
[INFO] [stdout] ...   |
[INFO] [stdout] 584 | |     Ok((gx, gy))
[INFO] [stdout] 585 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 Scharr gradient (dx, dy). Input: `[H, W]` grayscale.`
[INFO] [stdout]     = help: ends near `Computes 3x3 Scharr gradients (`gx`, `gy`) per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:490:1
[INFO] [stdout]     |
[INFO] [stdout] 490 | / pub fn scharr_3x3_gradients(input: &Tensor) -> Result<(Tensor, Tensor), ImgProcError> {
[INFO] [stdout] 491 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 492 | |     let len = h * w * channels;
[INFO] [stdout] 493 | |     let mut out_gx = vec![0.0f32; len];
[INFO] [stdout] ...   |
[INFO] [stdout] 584 | |     Ok((gx, gy))
[INFO] [stdout] 585 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Computes 3x3 Scharr gradients (`gx`, `gy`) per channel.`
[INFO] [stdout]     = help: ends near `Computes 3x3 Scharr gradients (`gx`, `gy`) per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:588:1
[INFO] [stdout]     |
[INFO] [stdout] 588 | / pub fn scharr_3x3_magnitude(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 589 | |     let (gx, gy) = scharr_3x3_gradients(input)?;
[INFO] [stdout] 590 | |     let gx_data = gx.data();
[INFO] [stdout] 591 | |     let gy_data = gy.data();
[INFO] [stdout] ...   |
[INFO] [stdout] 614 | |     Tensor::from_vec(gx.shape().to_vec(), out).map_err(Into::into)
[INFO] [stdout] 615 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 Scharr gradient magnitude. Input: `[H, W]` grayscale.`
[INFO] [stdout]     = help: ends near `Computes the Scharr gradient magnitude: `sqrt(gx^2 + gy^2)`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:588:1
[INFO] [stdout]     |
[INFO] [stdout] 588 | / pub fn scharr_3x3_magnitude(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 589 | |     let (gx, gy) = scharr_3x3_gradients(input)?;
[INFO] [stdout] 590 | |     let gx_data = gx.data();
[INFO] [stdout] 591 | |     let gy_data = gy.data();
[INFO] [stdout] ...   |
[INFO] [stdout] 614 | |     Tensor::from_vec(gx.shape().to_vec(), out).map_err(Into::into)
[INFO] [stdout] 615 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Computes the Scharr gradient magnitude: `sqrt(gx^2 + gy^2)`.`
[INFO] [stdout]     = help: ends near `Computes the Scharr gradient magnitude: `sqrt(gx^2 + gy^2)`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1966:1
[INFO] [stdout]      |
[INFO] [stdout] 1966 | / pub fn sift_descriptor(
[INFO] [stdout] 1967 | |     image: &Tensor,
[INFO] [stdout] 1968 | |     keypoints: &[(usize, usize)],
[INFO] [stdout] 1969 | | ) -> Result<Vec<[f32; 128]>, ImgProcError> {
[INFO] [stdout] ...    |
[INFO] [stdout] 2031 | |     Ok(descriptors)
[INFO] [stdout] 2032 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Compute SIFT-style descriptor at a keypoint.`
[INFO] [stdout]      = help: ends near `SIFT-like 128-element descriptor for a keypoint on a grayscale `[H,W,1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:1966:1
[INFO] [stdout]      |
[INFO] [stdout] 1966 | / pub fn sift_descriptor(
[INFO] [stdout] 1967 | |     image: &Tensor,
[INFO] [stdout] 1968 | |     keypoints: &[(usize, usize)],
[INFO] [stdout] 1969 | | ) -> Result<Vec<[f32; 128]>, ImgProcError> {
[INFO] [stdout] ...    |
[INFO] [stdout] 2031 | |     Ok(descriptors)
[INFO] [stdout] 2032 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `SIFT-like 128-element descriptor for a keypoint on a grayscale `[H,W,1]` image.`
[INFO] [stdout]      = help: ends near `SIFT-like 128-element descriptor for a keypoint on a grayscale `[H,W,1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:2037:1
[INFO] [stdout]      |
[INFO] [stdout] 2037 | / pub fn sift_match(
[INFO] [stdout] 2038 | |     desc_a: &[[f32; 128]],
[INFO] [stdout] 2039 | |     desc_b: &[[f32; 128]],
[INFO] [stdout] 2040 | |     ratio_threshold: f32,
[INFO] [stdout] ...    |
[INFO] [stdout] 2070 | |     matches
[INFO] [stdout] 2071 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Match SIFT descriptors.`
[INFO] [stdout]      = help: ends near `Matches SIFT descriptors using Euclidean distance with Lowe's ratio test.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/features.rs:2037:1
[INFO] [stdout]      |
[INFO] [stdout] 2037 | / pub fn sift_match(
[INFO] [stdout] 2038 | |     desc_a: &[[f32; 128]],
[INFO] [stdout] 2039 | |     desc_b: &[[f32; 128]],
[INFO] [stdout] 2040 | |     ratio_threshold: f32,
[INFO] [stdout] ...    |
[INFO] [stdout] 2070 | |     matches
[INFO] [stdout] 2071 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Matches SIFT descriptors using Euclidean distance with Lowe's ratio test.`
[INFO] [stdout]      = help: ends near `Matches SIFT descriptors using Euclidean distance with Lowe's ratio test.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:1006:1
[INFO] [stdout]      |
[INFO] [stdout] 1006 | / pub fn skeletonize(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1007 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1008 | |     if c != 1 {
[INFO] [stdout] 1009 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1081 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 1082 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Morphological skeletonization. Input: `[H, W]` binary.`
[INFO] [stdout]      = help: ends near `Zhang-Suen thinning algorithm on a binary single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/morphology.rs:1006:1
[INFO] [stdout]      |
[INFO] [stdout] 1006 | / pub fn skeletonize(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1007 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1008 | |     if c != 1 {
[INFO] [stdout] 1009 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1081 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 1082 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Zhang-Suen thinning algorithm on a binary single-channel `[H, W, 1]` image.`
[INFO] [stdout]      = help: ends near `Zhang-Suen thinning algorithm on a binary single-channel `[H, W, 1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:12:1
[INFO] [stdout]     |
[INFO] [stdout]  12 | / pub fn sobel_3x3_gradients(input: &Tensor) -> Result<(Tensor, Tensor), ImgProcError> {
[INFO] [stdout]  13 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout]  14 | |     let len = h * w * channels;
[INFO] [stdout]  15 | |     let mut out_gx = vec![0.0f32; len];
[INFO] [stdout] ...   |
[INFO] [stdout] 154 | |     ))
[INFO] [stdout] 155 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 Sobel gradient (dx, dy). Input: `[H, W]` grayscale f32.`
[INFO] [stdout]     = help: ends near `Computes 3x3 Sobel gradients (`gx`, `gy`) per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:12:1
[INFO] [stdout]     |
[INFO] [stdout]  12 | / pub fn sobel_3x3_gradients(input: &Tensor) -> Result<(Tensor, Tensor), ImgProcError> {
[INFO] [stdout]  13 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout]  14 | |     let len = h * w * channels;
[INFO] [stdout]  15 | |     let mut out_gx = vec![0.0f32; len];
[INFO] [stdout] ...   |
[INFO] [stdout] 154 | |     ))
[INFO] [stdout] 155 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Computes 3x3 Sobel gradients (`gx`, `gy`) per channel.`
[INFO] [stdout]     = help: ends near `Computes 3x3 Sobel gradients (`gx`, `gy`) per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:326:1
[INFO] [stdout]     |
[INFO] [stdout] 326 | / pub fn sobel_3x3_magnitude(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 327 | |     let (gx, gy) = sobel_3x3_gradients(input)?;
[INFO] [stdout] 328 | |     let gx_data = gx.data();
[INFO] [stdout] 329 | |     let gy_data = gy.data();
[INFO] [stdout] ...   |
[INFO] [stdout] 389 | |     Tensor::from_vec(gx.shape().to_vec(), out).map_err(Into::into)
[INFO] [stdout] 390 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 Sobel gradient magnitude. Input: `[H, W]` grayscale f32.`
[INFO] [stdout]     = help: ends near `Computes 3x3 Sobel gradient magnitude `sqrt(gx^2 + gy^2)` per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:326:1
[INFO] [stdout]     |
[INFO] [stdout] 326 | / pub fn sobel_3x3_magnitude(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 327 | |     let (gx, gy) = sobel_3x3_gradients(input)?;
[INFO] [stdout] 328 | |     let gx_data = gx.data();
[INFO] [stdout] 329 | |     let gy_data = gy.data();
[INFO] [stdout] ...   |
[INFO] [stdout] 389 | |     Tensor::from_vec(gx.shape().to_vec(), out).map_err(Into::into)
[INFO] [stdout] 390 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Computes 3x3 Sobel gradient magnitude `sqrt(gx^2 + gy^2)` per channel.`
[INFO] [stdout]     = help: ends near `Computes 3x3 Sobel gradient magnitude `sqrt(gx^2 + gy^2)` per channel.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/stereo.rs:32:1
[INFO] [stdout]     |
[INFO] [stdout]  32 | / pub fn stereo_block_matching(
[INFO] [stdout]  33 | |     left: &Tensor,
[INFO] [stdout]  34 | |     right: &Tensor,
[INFO] [stdout]  35 | |     config: &StereoConfig,
[INFO] [stdout] ...   |
[INFO] [stdout] 107 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 108 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Stereo block matching for disparity estimation.`
[INFO] [stdout]     = help: ends near `Compute a disparity map from a rectified stereo pair using block matching (SAD).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/stereo.rs:32:1
[INFO] [stdout]     |
[INFO] [stdout]  32 | / pub fn stereo_block_matching(
[INFO] [stdout]  33 | |     left: &Tensor,
[INFO] [stdout]  34 | |     right: &Tensor,
[INFO] [stdout]  35 | |     config: &StereoConfig,
[INFO] [stdout] ...   |
[INFO] [stdout] 107 | |     Tensor::from_vec(vec![h, w, 1], out).map_err(Into::into)
[INFO] [stdout] 108 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Compute a disparity map from a rectified stereo pair using block matching (SAD).`
[INFO] [stdout]     = help: ends near `Compute a disparity map from a rectified stereo pair using block matching (SAD).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/nms.rs:81:1
[INFO] [stdout]     |
[INFO] [stdout]  81 | / pub fn template_match(
[INFO] [stdout]  82 | |     image: &Tensor,
[INFO] [stdout]  83 | |     template: &Tensor,
[INFO] [stdout]  84 | |     method: TemplateMatchMethod,
[INFO] [stdout] ...   |
[INFO] [stdout] 172 | |     Ok(best)
[INFO] [stdout] 173 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Template matching. Input: `[H, W]` image and `[TH, TW]` template.`
[INFO] [stdout]     = help: ends near `Slides `template` over `image` computing a similarity map, returns the best match.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/nms.rs:81:1
[INFO] [stdout]     |
[INFO] [stdout]  81 | / pub fn template_match(
[INFO] [stdout]  82 | |     image: &Tensor,
[INFO] [stdout]  83 | |     template: &Tensor,
[INFO] [stdout]  84 | |     method: TemplateMatchMethod,
[INFO] [stdout] ...   |
[INFO] [stdout] 172 | |     Ok(best)
[INFO] [stdout] 173 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Slides `template` over `image` computing a similarity map, returns the best match.`
[INFO] [stdout]     = help: ends near `Slides `template` over `image` computing a similarity map, returns the best match.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/threshold.rs:13:1
[INFO] [stdout]    |
[INFO] [stdout] 13 | / pub fn threshold_binary(
[INFO] [stdout] 14 | |     input: &Tensor,
[INFO] [stdout] 15 | |     threshold: f32,
[INFO] [stdout] 16 | |     max_val: f32,
[INFO] [stdout] ...  |
[INFO] [stdout] 51 | |     Tensor::from_aligned(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 52 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Binary threshold: output 1.0 where input >= thresh, else 0.0. Input: `[H, W]`.`
[INFO] [stdout]    = help: ends near `Binary threshold: outputs `max_val` where value > threshold, else `0.0`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/threshold.rs:13:1
[INFO] [stdout]    |
[INFO] [stdout] 13 | / pub fn threshold_binary(
[INFO] [stdout] 14 | |     input: &Tensor,
[INFO] [stdout] 15 | |     threshold: f32,
[INFO] [stdout] 16 | |     max_val: f32,
[INFO] [stdout] ...  |
[INFO] [stdout] 51 | |     Tensor::from_aligned(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 52 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Binary threshold: outputs `max_val` where value > threshold, else `0.0`.`
[INFO] [stdout]    = help: ends near `Binary threshold: outputs `max_val` where value > threshold, else `0.0`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/threshold.rs:56:1
[INFO] [stdout]    |
[INFO] [stdout] 56 | / pub fn threshold_binary_inv(
[INFO] [stdout] 57 | |     input: &Tensor,
[INFO] [stdout] 58 | |     threshold: f32,
[INFO] [stdout] 59 | |     max_val: f32,
[INFO] [stdout] ...  |
[INFO] [stdout] 94 | |     Tensor::from_aligned(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 95 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Inverse binary threshold: output 1.0 where input < thresh. Input: `[H, W]`.`
[INFO] [stdout]    = help: ends near `Inverse binary threshold: outputs `0.0` where value > threshold, else `max_val`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/threshold.rs:56:1
[INFO] [stdout]    |
[INFO] [stdout] 56 | / pub fn threshold_binary_inv(
[INFO] [stdout] 57 | |     input: &Tensor,
[INFO] [stdout] 58 | |     threshold: f32,
[INFO] [stdout] 59 | |     max_val: f32,
[INFO] [stdout] ...  |
[INFO] [stdout] 94 | |     Tensor::from_aligned(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 95 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Inverse binary threshold: outputs `0.0` where value > threshold, else `max_val`.`
[INFO] [stdout]    = help: ends near `Inverse binary threshold: outputs `0.0` where value > threshold, else `max_val`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/threshold.rs:617:1
[INFO] [stdout]     |
[INFO] [stdout] 617 | / pub fn threshold_otsu(input: &Tensor, max_val: f32) -> Result<(f32, Tensor), ImgProcError> {
[INFO] [stdout] 618 | |     let (_h, _w, channels) = hwc_shape(input)?;
[INFO] [stdout] 619 | |     if channels != 1 {
[INFO] [stdout] 620 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 669 | |     Ok((threshold, thresholded))
[INFO] [stdout] 670 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Otsu's automatic threshold. Input: `[H, W]` grayscale with values in [0, 255].`
[INFO] [stdout]     = help: ends near `Returns `(threshold, thresholded_image)`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/threshold.rs:617:1
[INFO] [stdout]     |
[INFO] [stdout] 617 | / pub fn threshold_otsu(input: &Tensor, max_val: f32) -> Result<(f32, Tensor), ImgProcError> {
[INFO] [stdout] 618 | |     let (_h, _w, channels) = hwc_shape(input)?;
[INFO] [stdout] 619 | |     if channels != 1 {
[INFO] [stdout] 620 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 669 | |     Ok((threshold, thresholded))
[INFO] [stdout] 670 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Otsu threshold for single-channel `[H, W, 1]` images.`
[INFO] [stdout]     = help: ends near `Otsu threshold for single-channel `[H, W, 1]` images.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/threshold.rs:99:1
[INFO] [stdout]     |
[INFO] [stdout]  99 | / pub fn threshold_truncate(input: &Tensor, threshold: f32) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 100 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 101 | |     let data = input.data();
[INFO] [stdout] 102 | |     let len = data.len();
[INFO] [stdout] ...   |
[INFO] [stdout] 133 | |     Tensor::from_aligned(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 134 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Truncate threshold: clamp values above thresh. Input: `[H, W]`.`
[INFO] [stdout]     = help: ends near `Truncate threshold: caps values above `threshold`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/threshold.rs:99:1
[INFO] [stdout]     |
[INFO] [stdout]  99 | / pub fn threshold_truncate(input: &Tensor, threshold: f32) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 100 | |     let (h, w, channels) = hwc_shape(input)?;
[INFO] [stdout] 101 | |     let data = input.data();
[INFO] [stdout] 102 | |     let len = data.len();
[INFO] [stdout] ...   |
[INFO] [stdout] 133 | |     Tensor::from_aligned(vec![h, w, channels], out).map_err(Into::into)
[INFO] [stdout] 134 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Truncate threshold: caps values above `threshold`.`
[INFO] [stdout]     = help: ends near `Truncate threshold: caps values above `threshold`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/calibration.rs:127:1
[INFO] [stdout]     |
[INFO] [stdout] 127 | / pub fn triangulate_points(
[INFO] [stdout] 128 | |     pts_a: &[(f32, f32)],
[INFO] [stdout] 129 | |     pts_b: &[(f32, f32)],
[INFO] [stdout] 130 | |     baseline: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 146 | |         .collect()
[INFO] [stdout] 147 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Triangulate 3D points from two camera views.`
[INFO] [stdout]     = help: ends near `stereo pair.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/calibration.rs:127:1
[INFO] [stdout]     |
[INFO] [stdout] 127 | / pub fn triangulate_points(
[INFO] [stdout] 128 | |     pts_a: &[(f32, f32)],
[INFO] [stdout] 129 | |     pts_b: &[(f32, f32)],
[INFO] [stdout] 130 | |     baseline: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 146 | |         .collect()
[INFO] [stdout] 147 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Triangulate 3-D points from corresponding 2-D observations in a rectified`
[INFO] [stdout]     = help: ends near `Triangulate 3-D points from corresponding 2-D observations in a rectified`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/calibration.rs:44:1
[INFO] [stdout]    |
[INFO] [stdout] 44 | / pub fn undistort_points(points: &[(f32, f32)], intrinsics: &CameraIntrinsics) -> Vec<(f32, f32)> {
[INFO] [stdout] 45 | |     let CameraIntrinsics {
[INFO] [stdout] 46 | |         fx,
[INFO] [stdout] 47 | |         fy,
[INFO] [stdout] ...  |
[INFO] [stdout] 77 | |         .collect()
[INFO] [stdout] 78 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Undistort 2D points using camera intrinsics.`
[INFO] [stdout]    = help: ends near `Remove lens distortion from a set of 2-D pixel coordinates.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/calibration.rs:44:1
[INFO] [stdout]    |
[INFO] [stdout] 44 | / pub fn undistort_points(points: &[(f32, f32)], intrinsics: &CameraIntrinsics) -> Vec<(f32, f32)> {
[INFO] [stdout] 45 | |     let CameraIntrinsics {
[INFO] [stdout] 46 | |         fx,
[INFO] [stdout] 47 | |         fy,
[INFO] [stdout] ...  |
[INFO] [stdout] 77 | |         .collect()
[INFO] [stdout] 78 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Remove lens distortion from a set of 2-D pixel coordinates.`
[INFO] [stdout]    = help: ends near `Remove lens distortion from a set of 2-D pixel coordinates.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:736:1
[INFO] [stdout]     |
[INFO] [stdout] 736 | / pub fn warp_affine(
[INFO] [stdout] 737 | |     input: &Tensor,
[INFO] [stdout] 738 | |     out_h: usize,
[INFO] [stdout] 739 | |     out_w: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 790 | |     Tensor::from_vec(vec![out_h, out_w, channels], out).map_err(Into::into)
[INFO] [stdout] 791 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Apply an affine warp transform. Input: `[H, W, C]` or `[H, W]`.`
[INFO] [stdout]     = help: ends near `Applies a 2x3 affine transformation to an HWC image using bilinear interpolation.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:736:1
[INFO] [stdout]     |
[INFO] [stdout] 736 | / pub fn warp_affine(
[INFO] [stdout] 737 | |     input: &Tensor,
[INFO] [stdout] 738 | |     out_h: usize,
[INFO] [stdout] 739 | |     out_w: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 790 | |     Tensor::from_vec(vec![out_h, out_w, channels], out).map_err(Into::into)
[INFO] [stdout] 791 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Applies a 2x3 affine transformation to an HWC image using bilinear interpolation.`
[INFO] [stdout]     = help: ends near `Applies a 2x3 affine transformation to an HWC image using bilinear interpolation.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:800:1
[INFO] [stdout]     |
[INFO] [stdout] 800 | / pub fn warp_perspective(
[INFO] [stdout] 801 | |     input: &Tensor,
[INFO] [stdout] 802 | |     transform: &[f32; 9],
[INFO] [stdout] 803 | |     out_h: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 822 | |     Tensor::from_vec(vec![out_h, out_w, channels], out).map_err(Into::into)
[INFO] [stdout] 823 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Apply a perspective warp (homography). Input: `[H, W, C]` or `[H, W]`.`
[INFO] [stdout]     = help: ends near `Applies a 3x3 perspective (homography) transformation to an `[H, W, C]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/geometry.rs:800:1
[INFO] [stdout]     |
[INFO] [stdout] 800 | / pub fn warp_perspective(
[INFO] [stdout] 801 | |     input: &Tensor,
[INFO] [stdout] 802 | |     transform: &[f32; 9],
[INFO] [stdout] 803 | |     out_h: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 822 | |     Tensor::from_vec(vec![out_h, out_w, channels], out).map_err(Into::into)
[INFO] [stdout] 823 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Applies a 3x3 perspective (homography) transformation to an `[H, W, C]` image.`
[INFO] [stdout]     = help: ends near `Applies a 3x3 perspective (homography) transformation to an `[H, W, C]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/flow.rs:391:1
[INFO] [stdout]     |
[INFO] [stdout] 391 | / pub fn watershed(image: &Tensor, markers: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 392 | |     let (h, w, c) = hwc_shape(image)?;
[INFO] [stdout] 393 | |     if c != 1 {
[INFO] [stdout] 394 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 462 | |     Tensor::from_vec(vec![h, w, 1], out_data).map_err(Into::into)
[INFO] [stdout] 463 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Watershed segmentation. Input: `[H, W]` grayscale, markers: `[H, W]` integer labels.`
[INFO] [stdout]     = help: ends near `Marker-based watershed segmentation on a grayscale `[H,W,1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/flow.rs:391:1
[INFO] [stdout]     |
[INFO] [stdout] 391 | / pub fn watershed(image: &Tensor, markers: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 392 | |     let (h, w, c) = hwc_shape(image)?;
[INFO] [stdout] 393 | |     if c != 1 {
[INFO] [stdout] 394 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...   |
[INFO] [stdout] 462 | |     Tensor::from_vec(vec![h, w, 1], out_data).map_err(Into::into)
[INFO] [stdout] 463 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Marker-based watershed segmentation on a grayscale `[H,W,1]` image.`
[INFO] [stdout]     = help: ends near `Marker-based watershed segmentation on a grayscale `[H,W,1]` image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:341:1
[INFO] [stdout]     |
[INFO] [stdout] 341 | / pub struct Detection {
[INFO] [stdout] 342 | |     pub x: usize,
[INFO] [stdout] 343 | |     pub y: usize,
[INFO] [stdout] 344 | |     pub width: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 347 | |     pub class_id: usize,
[INFO] [stdout] 348 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Detection result for drawing (bounding box, label, confidence).`
[INFO] [stdout]     = help: ends near `A detection result for drawing purposes.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:341:1
[INFO] [stdout]     |
[INFO] [stdout] 341 | / pub struct Detection {
[INFO] [stdout] 342 | |     pub x: usize,
[INFO] [stdout] 343 | |     pub y: usize,
[INFO] [stdout] 344 | |     pub width: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 347 | |     pub class_id: usize,
[INFO] [stdout] 348 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `A detection result for drawing purposes.`
[INFO] [stdout]     = help: ends near `A detection result for drawing purposes.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/u8ops.rs:67:1
[INFO] [stdout]    |
[INFO] [stdout] 67 | / pub struct ImageU8 {
[INFO] [stdout] 68 | |     data: Vec<u8>,
[INFO] [stdout] 69 | |     height: usize,
[INFO] [stdout] 70 | |     width: usize,
[INFO] [stdout] 71 | |     channels: usize,
[INFO] [stdout] 72 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `HWC u8 image wrapper: `(width, height, channels, Vec<u8>)`.`
[INFO] [stdout]    = help: ends near `Simple u8 image wrapper (HWC layout, row-major).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/u8ops.rs:67:1
[INFO] [stdout]    |
[INFO] [stdout] 67 | / pub struct ImageU8 {
[INFO] [stdout] 68 | |     data: Vec<u8>,
[INFO] [stdout] 69 | |     height: usize,
[INFO] [stdout] 70 | |     width: usize,
[INFO] [stdout] 71 | |     channels: usize,
[INFO] [stdout] 72 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Simple u8 image wrapper (HWC layout, row-major).`
[INFO] [stdout]    = help: ends near `Simple u8 image wrapper (HWC layout, row-major).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/bitwise.rs:95:1
[INFO] [stdout]     |
[INFO] [stdout]  95 | / pub fn add_weighted(
[INFO] [stdout]  96 | |     a: &Tensor,
[INFO] [stdout]  97 | |     alpha: f32,
[INFO] [stdout]  98 | |     b: &Tensor,
[INFO] [stdout] ...   |
[INFO] [stdout] 114 | |     Ok(Tensor::from_vec(a.shape().to_vec(), out)?)
[INFO] [stdout] 115 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Alpha-blend two images with weights. Input: `[H, W, C]` f32.`
[INFO] [stdout]     = help: ends near `Alpha-blend two images: `dst = alpha * a + beta * b + gamma`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/bitwise.rs:95:1
[INFO] [stdout]     |
[INFO] [stdout]  95 | / pub fn add_weighted(
[INFO] [stdout]  96 | |     a: &Tensor,
[INFO] [stdout]  97 | |     alpha: f32,
[INFO] [stdout]  98 | |     b: &Tensor,
[INFO] [stdout] ...   |
[INFO] [stdout] 114 | |     Ok(Tensor::from_vec(a.shape().to_vec(), out)?)
[INFO] [stdout] 115 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Alpha-blend two images: `dst = alpha * a + beta * b + gamma`.`
[INFO] [stdout]     = help: ends near `Alpha-blend two images: `dst = alpha * a + beta * b + gamma`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_features.rs:738:1
[INFO] [stdout]     |
[INFO] [stdout] 738 | / pub fn bilateral_filter_u8(
[INFO] [stdout] 739 | |     src: &[u8],
[INFO] [stdout] 740 | |     width: usize,
[INFO] [stdout] 741 | |     height: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 865 | |     out
[INFO] [stdout] 866 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Bilateral filter on u8 image.`
[INFO] [stdout]     = help: ends near `Bilateral filter operating directly on u8 pixel data.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_features.rs:738:1
[INFO] [stdout]     |
[INFO] [stdout] 738 | / pub fn bilateral_filter_u8(
[INFO] [stdout] 739 | |     src: &[u8],
[INFO] [stdout] 740 | |     width: usize,
[INFO] [stdout] 741 | |     height: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 865 | |     out
[INFO] [stdout] 866 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Bilateral filter operating directly on u8 pixel data.`
[INFO] [stdout]     = help: ends near `Bilateral filter operating directly on u8 pixel data.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/bitwise.rs:49:1
[INFO] [stdout]    |
[INFO] [stdout] 49 | / pub fn bitwise_and(a: &Tensor, b: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 50 | |     if a.shape() != b.shape() {
[INFO] [stdout] 51 | |         return Err(ImgProcError::ShapeMismatch {
[INFO] [stdout] 52 | |             expected: a.shape().to_vec(),
[INFO] [stdout] ...  |
[INFO] [stdout] 62 | |     Ok(Tensor::from_vec(a.shape().to_vec(), out)?)
[INFO] [stdout] 63 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Bitwise AND of two binary/grayscale images.`
[INFO] [stdout]    = help: ends near `Elementwise AND of two single-channel binary masks.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/bitwise.rs:49:1
[INFO] [stdout]    |
[INFO] [stdout] 49 | / pub fn bitwise_and(a: &Tensor, b: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 50 | |     if a.shape() != b.shape() {
[INFO] [stdout] 51 | |         return Err(ImgProcError::ShapeMismatch {
[INFO] [stdout] 52 | |             expected: a.shape().to_vec(),
[INFO] [stdout] ...  |
[INFO] [stdout] 62 | |     Ok(Tensor::from_vec(a.shape().to_vec(), out)?)
[INFO] [stdout] 63 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Elementwise AND of two single-channel binary masks.`
[INFO] [stdout]    = help: ends near `Elementwise AND of two single-channel binary masks.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/bitwise.rs:83:1
[INFO] [stdout]    |
[INFO] [stdout] 83 | / pub fn bitwise_not(a: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 84 | |     let out: Vec<f32> = a
[INFO] [stdout] 85 | |         .data()
[INFO] [stdout] 86 | |         .iter()
[INFO] [stdout] ...  |
[INFO] [stdout] 89 | |     Ok(Tensor::from_vec(a.shape().to_vec(), out)?)
[INFO] [stdout] 90 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Bitwise NOT of a binary/grayscale image.`
[INFO] [stdout]    = help: ends near `Elementwise NOT of a single-channel binary mask.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/bitwise.rs:83:1
[INFO] [stdout]    |
[INFO] [stdout] 83 | / pub fn bitwise_not(a: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 84 | |     let out: Vec<f32> = a
[INFO] [stdout] 85 | |         .data()
[INFO] [stdout] 86 | |         .iter()
[INFO] [stdout] ...  |
[INFO] [stdout] 89 | |     Ok(Tensor::from_vec(a.shape().to_vec(), out)?)
[INFO] [stdout] 90 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Elementwise NOT of a single-channel binary mask.`
[INFO] [stdout]    = help: ends near `Elementwise NOT of a single-channel binary mask.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/bitwise.rs:66:1
[INFO] [stdout]    |
[INFO] [stdout] 66 | / pub fn bitwise_or(a: &Tensor, b: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 67 | |     if a.shape() != b.shape() {
[INFO] [stdout] 68 | |         return Err(ImgProcError::ShapeMismatch {
[INFO] [stdout] 69 | |             expected: a.shape().to_vec(),
[INFO] [stdout] ...  |
[INFO] [stdout] 79 | |     Ok(Tensor::from_vec(a.shape().to_vec(), out)?)
[INFO] [stdout] 80 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Bitwise OR of two binary/grayscale images.`
[INFO] [stdout]    = help: ends near `Elementwise OR of two single-channel binary masks.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/bitwise.rs:66:1
[INFO] [stdout]    |
[INFO] [stdout] 66 | / pub fn bitwise_or(a: &Tensor, b: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 67 | |     if a.shape() != b.shape() {
[INFO] [stdout] 68 | |         return Err(ImgProcError::ShapeMismatch {
[INFO] [stdout] 69 | |             expected: a.shape().to_vec(),
[INFO] [stdout] ...  |
[INFO] [stdout] 79 | |     Ok(Tensor::from_vec(a.shape().to_vec(), out)?)
[INFO] [stdout] 80 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Elementwise OR of two single-channel binary masks.`
[INFO] [stdout]    = help: ends near `Elementwise OR of two single-channel binary masks.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/u8_filters.rs:1882:1
[INFO] [stdout]      |
[INFO] [stdout] 1882 | / pub fn box_blur_3x3_u8(input: &ImageU8) -> Option<ImageU8> {
[INFO] [stdout] 1883 | |     if input.channels() != 1 {
[INFO] [stdout] 1884 | |         return None;
[INFO] [stdout] ...    |
[INFO] [stdout] 1942 | |     ImageU8::new(out, h, w, 1)
[INFO] [stdout] 1943 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `3x3 box blur on u8 image.`
[INFO] [stdout]      = help: ends near `Edge pixels use replicate (clamp) border.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/u8_filters.rs:1882:1
[INFO] [stdout]      |
[INFO] [stdout] 1882 | / pub fn box_blur_3x3_u8(input: &ImageU8) -> Option<ImageU8> {
[INFO] [stdout] 1883 | |     if input.channels() != 1 {
[INFO] [stdout] 1884 | |         return None;
[INFO] [stdout] ...    |
[INFO] [stdout] 1942 | |     ImageU8::new(out, h, w, 1)
[INFO] [stdout] 1943 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `3x3 box blur on single-channel u8 image.`
[INFO] [stdout]      = help: ends near `3x3 box blur on single-channel u8 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_canny.rs:25:1
[INFO] [stdout]     |
[INFO] [stdout]  25 | / pub fn canny_u8(input: &ImageU8, low_thresh: u8, high_thresh: u8) -> Result<ImageU8, ImgProcError> {
[INFO] [stdout]  26 | |     if input.channels() != 1 {
[INFO] [stdout]  27 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout]  28 | |             expected: 1,
[INFO] [stdout] ...   |
[INFO] [stdout] 292 | |     })
[INFO] [stdout] 293 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Canny edge detection on u8 grayscale image.`
[INFO] [stdout]     = help: ends near ``low_thresh` and `high_thresh` are in `[0, 255]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_canny.rs:25:1
[INFO] [stdout]     |
[INFO] [stdout]  25 | / pub fn canny_u8(input: &ImageU8, low_thresh: u8, high_thresh: u8) -> Result<ImageU8, ImgProcError> {
[INFO] [stdout]  26 | |     if input.channels() != 1 {
[INFO] [stdout]  27 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout]  28 | |             expected: 1,
[INFO] [stdout] ...   |
[INFO] [stdout] 292 | |     })
[INFO] [stdout] 293 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Canny edge detection on single-channel u8 image.`
[INFO] [stdout]     = help: ends near `Canny edge detection on single-channel u8 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/preprocess.rs:55:1
[INFO] [stdout]    |
[INFO] [stdout] 55 | / pub fn center_crop(image: &Tensor, size: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 56 | |     let (h, w, c) = hwc_shape(image)?;
[INFO] [stdout] 57 | |     if h <= size && w <= size {
[INFO] [stdout] 58 | |         return Ok(image.clone());
[INFO] [stdout] ...  |
[INFO] [stdout] 72 | |     Tensor::from_vec(vec![crop_h, crop_w, c], out).map_err(Into::into)
[INFO] [stdout] 73 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Center crop to target size. Input: `[H, W, C]` or `[H, W]`.`
[INFO] [stdout]    = help: ends near `Center-crop an `[H, W, C]` image to `size × size`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/preprocess.rs:55:1
[INFO] [stdout]    |
[INFO] [stdout] 55 | / pub fn center_crop(image: &Tensor, size: usize) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 56 | |     let (h, w, c) = hwc_shape(image)?;
[INFO] [stdout] 57 | |     if h <= size && w <= size {
[INFO] [stdout] 58 | |         return Ok(image.clone());
[INFO] [stdout] ...  |
[INFO] [stdout] 72 | |     Tensor::from_vec(vec![crop_h, crop_w, c], out).map_err(Into::into)
[INFO] [stdout] 73 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Center-crop an `[H, W, C]` image to `size × size`.`
[INFO] [stdout]    = help: ends near `Center-crop an `[H, W, C]` image to `size × size`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/preprocess.rs:24:1
[INFO] [stdout]    |
[INFO] [stdout] 24 | / pub fn chw_to_hwc(image: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 25 | |     let shape = image.shape();
[INFO] [stdout] 26 | |     if shape.len() != 3 {
[INFO] [stdout] 27 | |         return Err(ImgProcError::InvalidImageShape {
[INFO] [stdout] ...  |
[INFO] [stdout] 43 | |     Tensor::from_vec(vec![h, w, c], out).map_err(Into::into)
[INFO] [stdout] 44 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Convert CHW tensor layout to HWC.`
[INFO] [stdout]    = help: ends near `Convert an image from `[C, H, W]` (CHW) layout to `[H, W, C]` (HWC) layout.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/preprocess.rs:24:1
[INFO] [stdout]    |
[INFO] [stdout] 24 | / pub fn chw_to_hwc(image: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 25 | |     let shape = image.shape();
[INFO] [stdout] 26 | |     if shape.len() != 3 {
[INFO] [stdout] 27 | |         return Err(ImgProcError::InvalidImageShape {
[INFO] [stdout] ...  |
[INFO] [stdout] 43 | |     Tensor::from_vec(vec![h, w, c], out).map_err(Into::into)
[INFO] [stdout] 44 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Convert an image from `[C, H, W]` (CHW) layout to `[H, W, C]` (HWC) layout.`
[INFO] [stdout]    = help: ends near `Convert an image from `[C, H, W]` (CHW) layout to `[H, W, C]` (HWC) layout.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_color.rs:450:1
[INFO] [stdout]     |
[INFO] [stdout] 450 | / pub fn clahe_u8(
[INFO] [stdout] 451 | |     src: &[u8],
[INFO] [stdout] 452 | |     width: usize,
[INFO] [stdout] 453 | |     height: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 634 | |     out
[INFO] [stdout] 635 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `CLAHE on u8 grayscale image.`
[INFO] [stdout]     = help: ends near `CLAHE operating entirely in u8 domain — no float conversion in the hot loop.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_color.rs:450:1
[INFO] [stdout]     |
[INFO] [stdout] 450 | / pub fn clahe_u8(
[INFO] [stdout] 451 | |     src: &[u8],
[INFO] [stdout] 452 | |     width: usize,
[INFO] [stdout] 453 | |     height: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 634 | |     out
[INFO] [stdout] 635 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `CLAHE operating entirely in u8 domain — no float conversion in the hot loop.`
[INFO] [stdout]     = help: ends near `CLAHE operating entirely in u8 domain — no float conversion in the hot loop.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/augment.rs:202:1
[INFO] [stdout]     |
[INFO] [stdout] 202 | / pub fn color_jitter(
[INFO] [stdout] 203 | |     image: &Tensor,
[INFO] [stdout] 204 | |     brightness: f32,
[INFO] [stdout] 205 | |     contrast: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 279 | |     Ok(Tensor::from_vec(vec![h, w, c], out)?)
[INFO] [stdout] 280 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Random color jitter augmentation (brightness, contrast, saturation, hue).`
[INFO] [stdout]     = help: ends near `Apply random color jitter: brightness, contrast, saturation, hue adjustments.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/augment.rs:202:1
[INFO] [stdout]     |
[INFO] [stdout] 202 | / pub fn color_jitter(
[INFO] [stdout] 203 | |     image: &Tensor,
[INFO] [stdout] 204 | |     brightness: f32,
[INFO] [stdout] 205 | |     contrast: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 279 | |     Ok(Tensor::from_vec(vec![h, w, c], out)?)
[INFO] [stdout] 280 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Apply random color jitter: brightness, contrast, saturation, hue adjustments.`
[INFO] [stdout]     = help: ends near `Apply random color jitter: brightness, contrast, saturation, hue adjustments.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_filters.rs:196:1
[INFO] [stdout]     |
[INFO] [stdout] 196 | / pub fn dilate_3x3_u8(input: &ImageU8) -> Option<ImageU8> {
[INFO] [stdout] 197 | |     morph_3x3_separable(input, true)
[INFO] [stdout] 198 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 dilation on u8 image.`
[INFO] [stdout]     = help: ends near `3x3 dilation on single-channel u8 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_filters.rs:196:1
[INFO] [stdout]     |
[INFO] [stdout] 196 | / pub fn dilate_3x3_u8(input: &ImageU8) -> Option<ImageU8> {
[INFO] [stdout] 197 | |     morph_3x3_separable(input, true)
[INFO] [stdout] 198 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 dilation on single-channel u8 image.`
[INFO] [stdout]     = help: ends near `3x3 dilation on single-channel u8 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_features.rs:308:1
[INFO] [stdout]     |
[INFO] [stdout] 308 | / pub fn distance_transform_u8(image: &ImageU8) -> Vec<u16> {
[INFO] [stdout] 309 | |     if image.channels() != 1 {
[INFO] [stdout] 310 | |         return vec![];
[INFO] [stdout] ...   |
[INFO] [stdout] 464 | |     dist
[INFO] [stdout] 465 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Distance transform on u8 binary image.`
[INFO] [stdout]     = help: ends near `Returns result as a flat `Vec<u16>` (max distance = h + w).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_features.rs:308:1
[INFO] [stdout]     |
[INFO] [stdout] 308 | / pub fn distance_transform_u8(image: &ImageU8) -> Vec<u16> {
[INFO] [stdout] 309 | |     if image.channels() != 1 {
[INFO] [stdout] 310 | |         return vec![];
[INFO] [stdout] ...   |
[INFO] [stdout] 464 | |     dist
[INFO] [stdout] 465 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `L1 distance transform on binary u8 image. Non-zero pixels get distance 0,`
[INFO] [stdout]     = help: ends near `L1 distance transform on binary u8 image. Non-zero pixels get distance 0,`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:465:1
[INFO] [stdout]     |
[INFO] [stdout] 465 | / pub fn draw_circle(
[INFO] [stdout] 466 | |     image: &mut Tensor,
[INFO] [stdout] 467 | |     cx: i32,
[INFO] [stdout] 468 | |     cy: i32,
[INFO] [stdout] ...   |
[INFO] [stdout] 531 | |     Ok(())
[INFO] [stdout] 532 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Draw a circle on a u8 image.`
[INFO] [stdout]     = help: ends near `Draw a circle using the midpoint circle algorithm on a `[H, W, 3]` image tensor.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:465:1
[INFO] [stdout]     |
[INFO] [stdout] 465 | / pub fn draw_circle(
[INFO] [stdout] 466 | |     image: &mut Tensor,
[INFO] [stdout] 467 | |     cx: i32,
[INFO] [stdout] 468 | |     cy: i32,
[INFO] [stdout] ...   |
[INFO] [stdout] 531 | |     Ok(())
[INFO] [stdout] 532 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Draw a circle using the midpoint circle algorithm on a `[H, W, 3]` image tensor.`
[INFO] [stdout]     = help: ends near `Draw a circle using the midpoint circle algorithm on a `[H, W, 3]` image tensor.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:355:1
[INFO] [stdout]     |
[INFO] [stdout] 355 | / pub fn draw_detections(
[INFO] [stdout] 356 | |     image: &mut Tensor,
[INFO] [stdout] 357 | |     detections: &[Detection],
[INFO] [stdout] 358 | |     labels: &[&str],
[INFO] [stdout] ...   |
[INFO] [stdout] 388 | |     Ok(())
[INFO] [stdout] 389 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Draw detection boxes with labels on a u8 image.`
[INFO] [stdout]     = help: ends near `Draw detections (bounding boxes + labels) on a `[H, W, 3]` image tensor.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:355:1
[INFO] [stdout]     |
[INFO] [stdout] 355 | / pub fn draw_detections(
[INFO] [stdout] 356 | |     image: &mut Tensor,
[INFO] [stdout] 357 | |     detections: &[Detection],
[INFO] [stdout] 358 | |     labels: &[&str],
[INFO] [stdout] ...   |
[INFO] [stdout] 388 | |     Ok(())
[INFO] [stdout] 389 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Draw detections (bounding boxes + labels) on a `[H, W, 3]` image tensor.`
[INFO] [stdout]     = help: ends near `Draw detections (bounding boxes + labels) on a `[H, W, 3]` image tensor.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:393:1
[INFO] [stdout]     |
[INFO] [stdout] 393 | / pub fn draw_line(
[INFO] [stdout] 394 | |     image: &mut Tensor,
[INFO] [stdout] 395 | |     x0: i32,
[INFO] [stdout] 396 | |     y0: i32,
[INFO] [stdout] ...   |
[INFO] [stdout] 457 | |     Ok(())
[INFO] [stdout] 458 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Draw a line on a u8 image.`
[INFO] [stdout]     = help: ends near `Draw a line using Bresenham's algorithm on a `[H, W, 3]` image tensor.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:393:1
[INFO] [stdout]     |
[INFO] [stdout] 393 | / pub fn draw_line(
[INFO] [stdout] 394 | |     image: &mut Tensor,
[INFO] [stdout] 395 | |     x0: i32,
[INFO] [stdout] 396 | |     y0: i32,
[INFO] [stdout] ...   |
[INFO] [stdout] 457 | |     Ok(())
[INFO] [stdout] 458 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Draw a line using Bresenham's algorithm on a `[H, W, 3]` image tensor.`
[INFO] [stdout]     = help: ends near `Draw a line using Bresenham's algorithm on a `[H, W, 3]` image tensor.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:538:1
[INFO] [stdout]     |
[INFO] [stdout] 538 | / pub fn draw_polylines(
[INFO] [stdout] 539 | |     image: &mut Tensor,
[INFO] [stdout] 540 | |     points: &[(i32, i32)],
[INFO] [stdout] 541 | |     closed: bool,
[INFO] [stdout] ...   |
[INFO] [stdout] 571 | |     Ok(())
[INFO] [stdout] 572 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Draw polylines on a u8 image.`
[INFO] [stdout]     = help: ends near `Draw connected line segments on a `[H, W, 3]` image tensor.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:538:1
[INFO] [stdout]     |
[INFO] [stdout] 538 | / pub fn draw_polylines(
[INFO] [stdout] 539 | |     image: &mut Tensor,
[INFO] [stdout] 540 | |     points: &[(i32, i32)],
[INFO] [stdout] 541 | |     closed: bool,
[INFO] [stdout] ...   |
[INFO] [stdout] 571 | |     Ok(())
[INFO] [stdout] 572 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Draw connected line segments on a `[H, W, 3]` image tensor.`
[INFO] [stdout]     = help: ends near `Draw connected line segments on a `[H, W, 3]` image tensor.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/draw.rs:11:1
[INFO] [stdout]    |
[INFO] [stdout] 11 | / pub fn draw_rect(
[INFO] [stdout] 12 | |     image: &mut Tensor,
[INFO] [stdout] 13 | |     x: usize,
[INFO] [stdout] 14 | |     y: usize,
[INFO] [stdout] ...  |
[INFO] [stdout] 84 | |     Ok(())
[INFO] [stdout] 85 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Draw a rectangle on a u8 image.`
[INFO] [stdout]    = help: ends near `Draw a rectangle on a `[H, W, 3]` image tensor (values `[0, 1]`).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/draw.rs:11:1
[INFO] [stdout]    |
[INFO] [stdout] 11 | / pub fn draw_rect(
[INFO] [stdout] 12 | |     image: &mut Tensor,
[INFO] [stdout] 13 | |     x: usize,
[INFO] [stdout] 14 | |     y: usize,
[INFO] [stdout] ...  |
[INFO] [stdout] 84 | |     Ok(())
[INFO] [stdout] 85 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Draw a rectangle on a `[H, W, 3]` image tensor (values `[0, 1]`).`
[INFO] [stdout]    = help: ends near `Draw a rectangle on a `[H, W, 3]` image tensor (values `[0, 1]`).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:291:1
[INFO] [stdout]     |
[INFO] [stdout] 291 | / pub fn draw_text(
[INFO] [stdout] 292 | |     image: &mut Tensor,
[INFO] [stdout] 293 | |     text: &str,
[INFO] [stdout] 294 | |     x: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 337 | |     Ok(())
[INFO] [stdout] 338 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Draw text on a u8 image.`
[INFO] [stdout]     = help: ends near `Draw text on a `[H, W, 3]` image tensor using an embedded 8×8 bitmap font.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:291:1
[INFO] [stdout]     |
[INFO] [stdout] 291 | / pub fn draw_text(
[INFO] [stdout] 292 | |     image: &mut Tensor,
[INFO] [stdout] 293 | |     text: &str,
[INFO] [stdout] 294 | |     x: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 337 | |     Ok(())
[INFO] [stdout] 338 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Draw text on a `[H, W, 3]` image tensor using an embedded 8×8 bitmap font.`
[INFO] [stdout]     = help: ends near `Draw text on a `[H, W, 3]` image tensor using an embedded 8×8 bitmap font.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:643:1
[INFO] [stdout]     |
[INFO] [stdout] 643 | / pub fn draw_text_scaled(
[INFO] [stdout] 644 | |     image: &mut Tensor,
[INFO] [stdout] 645 | |     text: &str,
[INFO] [stdout] 646 | |     x: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 695 | |     Ok(())
[INFO] [stdout] 696 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Draw scaled text on a u8 image.`
[INFO] [stdout]     = help: ends near `Draw text with integer scaling (nearest-neighbor scaled 8x8 bitmap font).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:643:1
[INFO] [stdout]     |
[INFO] [stdout] 643 | / pub fn draw_text_scaled(
[INFO] [stdout] 644 | |     image: &mut Tensor,
[INFO] [stdout] 645 | |     text: &str,
[INFO] [stdout] 646 | |     x: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 695 | |     Ok(())
[INFO] [stdout] 696 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Draw text with integer scaling (nearest-neighbor scaled 8x8 bitmap font).`
[INFO] [stdout]     = help: ends near `Draw text with integer scaling (nearest-neighbor scaled 8x8 bitmap font).`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/augment.rs:303:1
[INFO] [stdout]     |
[INFO] [stdout] 303 | / pub fn elastic_transform(
[INFO] [stdout] 304 | |     image: &Tensor,
[INFO] [stdout] 305 | |     alpha: f32,
[INFO] [stdout] 306 | |     sigma: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 378 | |     Ok(Tensor::from_vec(vec![h, w, c], out)?)
[INFO] [stdout] 379 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Elastic deformation augmentation.`
[INFO] [stdout]     = help: ends near `Elastic distortion transform.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/augment.rs:303:1
[INFO] [stdout]     |
[INFO] [stdout] 303 | / pub fn elastic_transform(
[INFO] [stdout] 304 | |     image: &Tensor,
[INFO] [stdout] 305 | |     alpha: f32,
[INFO] [stdout] 306 | |     sigma: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 378 | |     Ok(Tensor::from_vec(vec![h, w, c], out)?)
[INFO] [stdout] 379 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Elastic distortion transform.`
[INFO] [stdout]     = help: ends near `Elastic distortion transform.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_filters.rs:205:1
[INFO] [stdout]     |
[INFO] [stdout] 205 | / pub fn erode_3x3_u8(input: &ImageU8) -> Option<ImageU8> {
[INFO] [stdout] 206 | |     morph_3x3_separable(input, false)
[INFO] [stdout] 207 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 erosion on u8 image.`
[INFO] [stdout]     = help: ends near `3x3 erosion on single-channel u8 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_filters.rs:205:1
[INFO] [stdout]     |
[INFO] [stdout] 205 | / pub fn erode_3x3_u8(input: &ImageU8) -> Option<ImageU8> {
[INFO] [stdout] 206 | |     morph_3x3_separable(input, false)
[INFO] [stdout] 207 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 erosion on single-channel u8 image.`
[INFO] [stdout]     = help: ends near `3x3 erosion on single-channel u8 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_features.rs:87:1
[INFO] [stdout]     |
[INFO] [stdout]  87 | / pub fn fast9_detect_u8(image: &ImageU8, threshold: u8, nms: bool) -> Vec<(u16, u16)> {
[INFO] [stdout]  88 | |     if image.channels() != 1 {
[INFO] [stdout]  89 | |         return vec![];
[INFO] [stdout] ...   |
[INFO] [stdout] 170 | |     result
[INFO] [stdout] 171 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `FAST-9 corner detection on u8 grayscale image.`
[INFO] [stdout]     = help: ends near `Returns keypoints as (x, y) coordinates.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_features.rs:87:1
[INFO] [stdout]     |
[INFO] [stdout]  87 | / pub fn fast9_detect_u8(image: &ImageU8, threshold: u8, nms: bool) -> Vec<(u16, u16)> {
[INFO] [stdout]  88 | |     if image.channels() != 1 {
[INFO] [stdout]  89 | |         return vec![];
[INFO] [stdout] ...   |
[INFO] [stdout] 170 | |     result
[INFO] [stdout] 171 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `FAST-9 corner detection on u8 single-channel image.`
[INFO] [stdout]     = help: ends near `FAST-9 corner detection on u8 single-channel image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:576:1
[INFO] [stdout]     |
[INFO] [stdout] 576 | / pub fn fill_poly(
[INFO] [stdout] 577 | |     image: &mut Tensor,
[INFO] [stdout] 578 | |     points: &[(i32, i32)],
[INFO] [stdout] 579 | |     color: [f32; 3],
[INFO] [stdout] ...   |
[INFO] [stdout] 636 | |     Ok(())
[INFO] [stdout] 637 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Fill a polygon region on a u8 image.`
[INFO] [stdout]     = help: ends near `Fill a polygon using scanline fill on a `[H, W, 3]` image tensor.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/draw.rs:576:1
[INFO] [stdout]     |
[INFO] [stdout] 576 | / pub fn fill_poly(
[INFO] [stdout] 577 | |     image: &mut Tensor,
[INFO] [stdout] 578 | |     points: &[(i32, i32)],
[INFO] [stdout] 579 | |     color: [f32; 3],
[INFO] [stdout] ...   |
[INFO] [stdout] 636 | |     Ok(())
[INFO] [stdout] 637 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Fill a polygon using scanline fill on a `[H, W, 3]` image tensor.`
[INFO] [stdout]     = help: ends near `Fill a polygon using scanline fill on a `[H, W, 3]` image tensor.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/u8_filters.rs:1645:1
[INFO] [stdout]      |
[INFO] [stdout] 1645 | / pub fn gaussian_blur_3x3_u8(input: &ImageU8) -> Option<ImageU8> {
[INFO] [stdout] 1646 | |     if input.channels() != 1 {
[INFO] [stdout] 1647 | |         return None;
[INFO] [stdout] ...    |
[INFO] [stdout] 1697 | |     ImageU8::new(out, h, w, 1)
[INFO] [stdout] 1698 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `3x3 Gaussian blur on u8 image.`
[INFO] [stdout]      = help: ends near `Rayon parallelism across tiles when image is large enough.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/u8_filters.rs:1645:1
[INFO] [stdout]      |
[INFO] [stdout] 1645 | / pub fn gaussian_blur_3x3_u8(input: &ImageU8) -> Option<ImageU8> {
[INFO] [stdout] 1646 | |     if input.channels() != 1 {
[INFO] [stdout] 1647 | |         return None;
[INFO] [stdout] ...    |
[INFO] [stdout] 1697 | |     ImageU8::new(out, h, w, 1)
[INFO] [stdout] 1698 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `3x3 Gaussian blur on single-channel u8 image.`
[INFO] [stdout]      = help: ends near `3x3 Gaussian blur on single-channel u8 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/augment.rs:286:1
[INFO] [stdout]     |
[INFO] [stdout] 286 | / pub fn gaussian_noise(image: &Tensor, sigma: f32, seed: u64) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 287 | |     let (h, w, c) = hwc_shape(image)?;
[INFO] [stdout] 288 | |     let data = image.data();
[INFO] [stdout] 289 | |     let total = h * w * c;
[INFO] [stdout] ...   |
[INFO] [stdout] 296 | |     Ok(Tensor::from_vec(vec![h, w, c], out)?)
[INFO] [stdout] 297 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Add Gaussian noise to an image.`
[INFO] [stdout]     = help: ends near `Add Gaussian noise to an image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_harris.rs:20:1
[INFO] [stdout]     |
[INFO] [stdout]  20 | / pub fn harris_corners_u8(
[INFO] [stdout]  21 | |     src: &[u8],
[INFO] [stdout]  22 | |     width: usize,
[INFO] [stdout]  23 | |     height: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 164 | |     corners
[INFO] [stdout] 165 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Harris corner detection on u8 image.`
[INFO] [stdout]     = help: ends near `Harris corner detection operating directly on u8 grayscale image data.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_harris.rs:20:1
[INFO] [stdout]     |
[INFO] [stdout]  20 | / pub fn harris_corners_u8(
[INFO] [stdout]  21 | |     src: &[u8],
[INFO] [stdout]  22 | |     width: usize,
[INFO] [stdout]  23 | |     height: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 164 | |     corners
[INFO] [stdout] 165 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Harris corner detection operating directly on u8 grayscale image data.`
[INFO] [stdout]     = help: ends near `Harris corner detection operating directly on u8 grayscale image data.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_color.rs:377:1
[INFO] [stdout]     |
[INFO] [stdout] 377 | / pub fn histogram_u8(src: &[u8], len: usize) -> [u32; 256] {
[INFO] [stdout] 378 | |     assert!(src.len() >= len, "histogram_u8: src too short");
[INFO] [stdout] 379 | |
[INFO] [stdout] 380 | |     if len < RAYON_THRESHOLD {
[INFO] [stdout] ...   |
[INFO] [stdout] 433 | |     hist
[INFO] [stdout] 434 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Compute 256-bin histogram from u8 grayscale data.`
[INFO] [stdout]     = help: ends near `Computes a 256-bin histogram from raw u8 data.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_color.rs:377:1
[INFO] [stdout]     |
[INFO] [stdout] 377 | / pub fn histogram_u8(src: &[u8], len: usize) -> [u32; 256] {
[INFO] [stdout] 378 | |     assert!(src.len() >= len, "histogram_u8: src too short");
[INFO] [stdout] 379 | |
[INFO] [stdout] 380 | |     if len < RAYON_THRESHOLD {
[INFO] [stdout] ...   |
[INFO] [stdout] 433 | |     hist
[INFO] [stdout] 434 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Computes a 256-bin histogram from raw u8 data.`
[INFO] [stdout]     = help: ends near `Computes a 256-bin histogram from raw u8 data.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/preprocess.rs:8:1
[INFO] [stdout]    |
[INFO] [stdout]  8 | / pub fn hwc_to_chw(image: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout]  9 | |     let (h, w, c) = hwc_shape(image)?;
[INFO] [stdout] 10 | |     let src = image.data();
[INFO] [stdout] 11 | |     let mut out = vec![0.0f32; c * h * w];
[INFO] [stdout] ...  |
[INFO] [stdout] 20 | |     Tensor::from_vec(vec![c, h, w], out).map_err(Into::into)
[INFO] [stdout] 21 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Convert HWC tensor layout to CHW.`
[INFO] [stdout]    = help: ends near `Convert an image from `[H, W, C]` (HWC) layout to `[C, H, W]` (CHW) layout.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/preprocess.rs:8:1
[INFO] [stdout]    |
[INFO] [stdout]  8 | / pub fn hwc_to_chw(image: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout]  9 | |     let (h, w, c) = hwc_shape(image)?;
[INFO] [stdout] 10 | |     let src = image.data();
[INFO] [stdout] 11 | |     let mut out = vec![0.0f32; c * h * w];
[INFO] [stdout] ...  |
[INFO] [stdout] 20 | |     Tensor::from_vec(vec![c, h, w], out).map_err(Into::into)
[INFO] [stdout] 21 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Convert an image from `[H, W, C]` (HWC) layout to `[C, H, W]` (CHW) layout.`
[INFO] [stdout]    = help: ends near `Convert an image from `[H, W, C]` (HWC) layout to `[C, H, W]` (CHW) layout.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/preprocess.rs:84:1
[INFO] [stdout]     |
[INFO] [stdout]  84 | / pub fn imagenet_preprocess(image: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout]  85 | |     const IMAGENET_MEAN: [f32; 3] = [0.485, 0.456, 0.406];
[INFO] [stdout]  86 | |     const IMAGENET_STD: [f32; 3] = [0.229, 0.224, 0.225];
[INFO] [stdout] ...   |
[INFO] [stdout] 105 | |     hwc_to_chw(&normalized)
[INFO] [stdout] 106 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `ImageNet-standard preprocessing (resize 256, center crop 224, normalize).`
[INFO] [stdout]     = help: ends near `Standard ImageNet preprocessing pipeline.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/preprocess.rs:84:1
[INFO] [stdout]     |
[INFO] [stdout]  84 | / pub fn imagenet_preprocess(image: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout]  85 | |     const IMAGENET_MEAN: [f32; 3] = [0.485, 0.456, 0.406];
[INFO] [stdout]  86 | |     const IMAGENET_STD: [f32; 3] = [0.229, 0.224, 0.225];
[INFO] [stdout] ...   |
[INFO] [stdout] 105 | |     hwc_to_chw(&normalized)
[INFO] [stdout] 106 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Standard ImageNet preprocessing pipeline.`
[INFO] [stdout]     = help: ends near `Standard ImageNet preprocessing pipeline.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/io.rs:14:1
[INFO] [stdout]    |
[INFO] [stdout] 14 | / pub fn imread(path: impl AsRef<Path>) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 15 | |     let path = path.as_ref();
[INFO] [stdout] 16 | |     let reader = ImageReader::open(path).map_err(|e| ImgProcError::Io {
[INFO] [stdout] 17 | |         message: format!("{}: {e}", path.display()),
[INFO] [stdout] ...  |
[INFO] [stdout] 28 | |     Tensor::from_vec(vec![h, w, 3], data).map_err(Into::into)
[INFO] [stdout] 29 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Read an image file as `ImageU8`. Supports PNG, JPEG, BMP, GIF, TIFF, WebP.`
[INFO] [stdout]    = help: ends near `Read an image from disk and return it as a `[H, W, C]` `f32` tensor with values in `[0, 1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/io.rs:14:1
[INFO] [stdout]    |
[INFO] [stdout] 14 | / pub fn imread(path: impl AsRef<Path>) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 15 | |     let path = path.as_ref();
[INFO] [stdout] 16 | |     let reader = ImageReader::open(path).map_err(|e| ImgProcError::Io {
[INFO] [stdout] 17 | |         message: format!("{}: {e}", path.display()),
[INFO] [stdout] ...  |
[INFO] [stdout] 28 | |     Tensor::from_vec(vec![h, w, 3], data).map_err(Into::into)
[INFO] [stdout] 29 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Read an image from disk and return it as a `[H, W, C]` `f32` tensor with values in `[0, 1]`.`
[INFO] [stdout]    = help: ends near `Read an image from disk and return it as a `[H, W, C]` `f32` tensor with values in `[0, 1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/io.rs:34:1
[INFO] [stdout]    |
[INFO] [stdout] 34 | / pub fn imread_gray(path: impl AsRef<Path>) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 35 | |     let path = path.as_ref();
[INFO] [stdout] 36 | |     let reader = ImageReader::open(path).map_err(|e| ImgProcError::Io {
[INFO] [stdout] 37 | |         message: format!("{}: {e}", path.display()),
[INFO] [stdout] ...  |
[INFO] [stdout] 48 | |     Tensor::from_vec(vec![h, w, 1], data).map_err(Into::into)
[INFO] [stdout] 49 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Read an image file as grayscale `ImageU8`.`
[INFO] [stdout]    = help: ends near `Read an image as grayscale and return it as a `[H, W, 1]` `f32` tensor with values in `[0, 1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/io.rs:34:1
[INFO] [stdout]    |
[INFO] [stdout] 34 | / pub fn imread_gray(path: impl AsRef<Path>) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 35 | |     let path = path.as_ref();
[INFO] [stdout] 36 | |     let reader = ImageReader::open(path).map_err(|e| ImgProcError::Io {
[INFO] [stdout] 37 | |         message: format!("{}: {e}", path.display()),
[INFO] [stdout] ...  |
[INFO] [stdout] 48 | |     Tensor::from_vec(vec![h, w, 1], data).map_err(Into::into)
[INFO] [stdout] 49 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Read an image as grayscale and return it as a `[H, W, 1]` `f32` tensor with values in `[0, 1]`.`
[INFO] [stdout]    = help: ends near `Read an image as grayscale and return it as a `[H, W, 1]` `f32` tensor with values in `[0, 1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/io.rs:56:1
[INFO] [stdout]     |
[INFO] [stdout]  56 | / pub fn imwrite(path: impl AsRef<Path>, image: &Tensor) -> Result<(), ImgProcError> {
[INFO] [stdout]  57 | |     let path = path.as_ref();
[INFO] [stdout]  58 | |     let shape = image.shape();
[INFO] [stdout]  59 | |     if shape.len() != 3 {
[INFO] [stdout] ...   |
[INFO] [stdout] 105 | |         })
[INFO] [stdout] 106 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Write an `ImageU8` to a file. Format inferred from extension (png, jpg, bmp, etc.).`
[INFO] [stdout]     = help: ends near `Write a `[H, W, C]` `f32` tensor (values in `[0, 1]`) to disk.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/io.rs:56:1
[INFO] [stdout]     |
[INFO] [stdout]  56 | / pub fn imwrite(path: impl AsRef<Path>, image: &Tensor) -> Result<(), ImgProcError> {
[INFO] [stdout]  57 | |     let path = path.as_ref();
[INFO] [stdout]  58 | |     let shape = image.shape();
[INFO] [stdout]  59 | |     if shape.len() != 3 {
[INFO] [stdout] ...   |
[INFO] [stdout] 105 | |         })
[INFO] [stdout] 106 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Write a `[H, W, C]` `f32` tensor (values in `[0, 1]`) to disk.`
[INFO] [stdout]     = help: ends near `Write a `[H, W, C]` `f32` tensor (values in `[0, 1]`) to disk.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/bitwise.rs:11:1
[INFO] [stdout]    |
[INFO] [stdout] 11 | / pub fn in_range(image: &Tensor, lower: &[f32], upper: &[f32]) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 12 | |     let shape = image.shape();
[INFO] [stdout] 13 | |     if shape.len() != 3 {
[INFO] [stdout] 14 | |         return Err(ImgProcError::InvalidImageShape {
[INFO] [stdout] ...  |
[INFO] [stdout] 43 | |     Ok(Tensor::from_vec(vec![h, w, 1], out)?)
[INFO] [stdout] 44 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Check if pixel values fall within a per-channel range.`
[INFO] [stdout]    = help: ends near ``[lower, upper]` (inclusive), 0.0 otherwise.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/bitwise.rs:11:1
[INFO] [stdout]    |
[INFO] [stdout] 11 | / pub fn in_range(image: &Tensor, lower: &[f32], upper: &[f32]) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 12 | |     let shape = image.shape();
[INFO] [stdout] 13 | |     if shape.len() != 3 {
[INFO] [stdout] 14 | |         return Err(ImgProcError::InvalidImageShape {
[INFO] [stdout] ...  |
[INFO] [stdout] 43 | |     Ok(Tensor::from_vec(vec![h, w, 1], out)?)
[INFO] [stdout] 44 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Create a binary mask where each pixel is 1.0 if all channels are within`
[INFO] [stdout]    = help: ends near `Create a binary mask where each pixel is 1.0 if all channels are within`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/u8_filters.rs:2563:1
[INFO] [stdout]      |
[INFO] [stdout] 2563 | / pub fn median_blur_3x3_u8(input: &ImageU8) -> Option<ImageU8> {
[INFO] [stdout] 2564 | |     if input.channels() != 1 {
[INFO] [stdout] 2565 | |         return None;
[INFO] [stdout] ...    |
[INFO] [stdout] 2620 | |     ImageU8::new(out, h, w, 1)
[INFO] [stdout] 2621 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `3x3 median blur on u8 image.`
[INFO] [stdout]      = help: ends near `processing 16 pixels at a time. Scalar fallback for non-NEON and border pixels.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/u8_filters.rs:2563:1
[INFO] [stdout]      |
[INFO] [stdout] 2563 | / pub fn median_blur_3x3_u8(input: &ImageU8) -> Option<ImageU8> {
[INFO] [stdout] 2564 | |     if input.channels() != 1 {
[INFO] [stdout] 2565 | |         return None;
[INFO] [stdout] ...    |
[INFO] [stdout] 2620 | |     ImageU8::new(out, h, w, 1)
[INFO] [stdout] 2621 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `3x3 median filter on single-channel u8 image.`
[INFO] [stdout]      = help: ends near `3x3 median filter on single-channel u8 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/preprocess.rs:47:1
[INFO] [stdout]    |
[INFO] [stdout] 47 | / pub fn normalize_image(image: &Tensor, mean: &[f32], std: &[f32]) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 48 | |     // Delegate to the existing normalize function.
[INFO] [stdout] 49 | |     super::normalize::normalize(image, mean, std)
[INFO] [stdout] 50 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Normalize u8 image to [0, 1] f32 then apply mean/std normalization.`
[INFO] [stdout]    = help: ends near `Per-channel normalization: `(pixel - mean[c]) / std[c]` for an HWC image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/preprocess.rs:47:1
[INFO] [stdout]    |
[INFO] [stdout] 47 | / pub fn normalize_image(image: &Tensor, mean: &[f32], std: &[f32]) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 48 | |     // Delegate to the existing normalize function.
[INFO] [stdout] 49 | |     super::normalize::normalize(image, mean, std)
[INFO] [stdout] 50 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Per-channel normalization: `(pixel - mean[c]) / std[c]` for an HWC image.`
[INFO] [stdout]    = help: ends near `Per-channel normalization: `(pixel - mean[c]) / std[c]` for an HWC image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/augment.rs:41:1
[INFO] [stdout]    |
[INFO] [stdout] 41 | / pub fn random_crop(
[INFO] [stdout] 42 | |     image: &Tensor,
[INFO] [stdout] 43 | |     out_h: usize,
[INFO] [stdout] 44 | |     out_w: usize,
[INFO] [stdout] ...  |
[INFO] [stdout] 66 | |     Ok(Tensor::from_vec(vec![out_h, out_w, c], out)?)
[INFO] [stdout] 67 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Random crop augmentation.`
[INFO] [stdout]    = help: ends near `Randomly crop a `[H, W, C]` image to `(out_h, out_w)`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/augment.rs:41:1
[INFO] [stdout]    |
[INFO] [stdout] 41 | / pub fn random_crop(
[INFO] [stdout] 42 | |     image: &Tensor,
[INFO] [stdout] 43 | |     out_h: usize,
[INFO] [stdout] 44 | |     out_w: usize,
[INFO] [stdout] ...  |
[INFO] [stdout] 66 | |     Ok(Tensor::from_vec(vec![out_h, out_w, c], out)?)
[INFO] [stdout] 67 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Randomly crop a `[H, W, C]` image to `(out_h, out_w)`.`
[INFO] [stdout]    = help: ends near `Randomly crop a `[H, W, C]` image to `(out_h, out_w)`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/augment.rs:160:1
[INFO] [stdout]     |
[INFO] [stdout] 160 | / pub fn random_erasing(
[INFO] [stdout] 161 | |     image: &Tensor,
[INFO] [stdout] 162 | |     p: f32,
[INFO] [stdout] 163 | |     scale_min: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 196 | |     Ok(Tensor::from_vec(vec![h, w, c], out)?)
[INFO] [stdout] 197 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Random erasing (cutout) augmentation.`
[INFO] [stdout]     = help: ends near `Random erasing (cutout): randomly erase a rectangular region with probability `p`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/augment.rs:160:1
[INFO] [stdout]     |
[INFO] [stdout] 160 | / pub fn random_erasing(
[INFO] [stdout] 161 | |     image: &Tensor,
[INFO] [stdout] 162 | |     p: f32,
[INFO] [stdout] 163 | |     scale_min: f32,
[INFO] [stdout] ...   |
[INFO] [stdout] 196 | |     Ok(Tensor::from_vec(vec![h, w, c], out)?)
[INFO] [stdout] 197 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Random erasing (cutout): randomly erase a rectangular region with probability `p`.`
[INFO] [stdout]     = help: ends near `Random erasing (cutout): randomly erase a rectangular region with probability `p`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/augment.rs:70:1
[INFO] [stdout]    |
[INFO] [stdout] 70 | / pub fn random_horizontal_flip(image: &Tensor, p: f32, seed: u64) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 71 | |     let mut rng = Rng::new(seed);
[INFO] [stdout] 72 | |     if rng.uniform() >= p {
[INFO] [stdout] 73 | |         return Ok(image.clone());
[INFO] [stdout] ...  |
[INFO] [stdout] 85 | |     Ok(Tensor::from_vec(vec![h, w, c], out)?)
[INFO] [stdout] 86 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Random horizontal flip augmentation (50% probability).`
[INFO] [stdout]    = help: ends near `Randomly flip horizontally with probability `p`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/augment.rs:70:1
[INFO] [stdout]    |
[INFO] [stdout] 70 | / pub fn random_horizontal_flip(image: &Tensor, p: f32, seed: u64) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 71 | |     let mut rng = Rng::new(seed);
[INFO] [stdout] 72 | |     if rng.uniform() >= p {
[INFO] [stdout] 73 | |         return Ok(image.clone());
[INFO] [stdout] ...  |
[INFO] [stdout] 85 | |     Ok(Tensor::from_vec(vec![h, w, c], out)?)
[INFO] [stdout] 86 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Randomly flip horizontally with probability `p`.`
[INFO] [stdout]    = help: ends near `Randomly flip horizontally with probability `p`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/augment.rs:108:1
[INFO] [stdout]     |
[INFO] [stdout] 108 | / pub fn random_rotation(
[INFO] [stdout] 109 | |     image: &Tensor,
[INFO] [stdout] 110 | |     max_degrees: f32,
[INFO] [stdout] 111 | |     seed: u64,
[INFO] [stdout] ...   |
[INFO] [stdout] 154 | |     Ok(Tensor::from_vec(vec![h, w, c], out)?)
[INFO] [stdout] 155 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Random rotation augmentation.`
[INFO] [stdout]     = help: ends near `Rotate image by a random angle in `[-max_degrees, max_degrees]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/augment.rs:108:1
[INFO] [stdout]     |
[INFO] [stdout] 108 | / pub fn random_rotation(
[INFO] [stdout] 109 | |     image: &Tensor,
[INFO] [stdout] 110 | |     max_degrees: f32,
[INFO] [stdout] 111 | |     seed: u64,
[INFO] [stdout] ...   |
[INFO] [stdout] 154 | |     Ok(Tensor::from_vec(vec![h, w, c], out)?)
[INFO] [stdout] 155 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Rotate image by a random angle in `[-max_degrees, max_degrees]`.`
[INFO] [stdout]     = help: ends near `Rotate image by a random angle in `[-max_degrees, max_degrees]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/augment.rs:89:1
[INFO] [stdout]     |
[INFO] [stdout]  89 | / pub fn random_vertical_flip(image: &Tensor, p: f32, seed: u64) -> Result<Tensor, ImgProcError> {
[INFO] [stdout]  90 | |     let mut rng = Rng::new(seed);
[INFO] [stdout]  91 | |     if rng.uniform() >= p {
[INFO] [stdout]  92 | |         return Ok(image.clone());
[INFO] [stdout] ...   |
[INFO] [stdout] 102 | |     Ok(Tensor::from_vec(vec![h, w, c], out)?)
[INFO] [stdout] 103 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Random vertical flip augmentation (50% probability).`
[INFO] [stdout]     = help: ends near `Randomly flip vertically with probability `p`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/augment.rs:89:1
[INFO] [stdout]     |
[INFO] [stdout]  89 | / pub fn random_vertical_flip(image: &Tensor, p: f32, seed: u64) -> Result<Tensor, ImgProcError> {
[INFO] [stdout]  90 | |     let mut rng = Rng::new(seed);
[INFO] [stdout]  91 | |     if rng.uniform() >= p {
[INFO] [stdout]  92 | |         return Ok(image.clone());
[INFO] [stdout] ...   |
[INFO] [stdout] 102 | |     Ok(Tensor::from_vec(vec![h, w, c], out)?)
[INFO] [stdout] 103 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Randomly flip vertically with probability `p`.`
[INFO] [stdout]     = help: ends near `Randomly flip vertically with probability `p`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/intensity.rs:26:1
[INFO] [stdout]    |
[INFO] [stdout] 26 | / pub fn rescale_intensity(
[INFO] [stdout] 27 | |     img: &Tensor,
[INFO] [stdout] 28 | |     in_min: f32,
[INFO] [stdout] 29 | |     in_max: f32,
[INFO] [stdout] ...  |
[INFO] [stdout] 53 | |     Tensor::from_vec(vec![h, w, c], out).map_err(Into::into)
[INFO] [stdout] 54 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Rescale intensity to [0, 1] or a target range.`
[INFO] [stdout]    = help: ends near `Linearly rescales pixel intensities from `[in_min, in_max]` to `[out_min, out_max]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/intensity.rs:26:1
[INFO] [stdout]    |
[INFO] [stdout] 26 | / pub fn rescale_intensity(
[INFO] [stdout] 27 | |     img: &Tensor,
[INFO] [stdout] 28 | |     in_min: f32,
[INFO] [stdout] 29 | |     in_max: f32,
[INFO] [stdout] ...  |
[INFO] [stdout] 53 | |     Tensor::from_vec(vec![h, w, c], out).map_err(Into::into)
[INFO] [stdout] 54 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Linearly rescales pixel intensities from `[in_min, in_max]` to `[out_min, out_max]`.`
[INFO] [stdout]    = help: ends near `Linearly rescales pixel intensities from `[in_min, in_max]` to `[out_min, out_max]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_resize.rs:313:1
[INFO] [stdout]     |
[INFO] [stdout] 313 | / pub fn resize_bilinear_u8(input: &ImageU8, out_h: usize, out_w: usize) -> Option<ImageU8> {
[INFO] [stdout] 314 | |     let (h, w, c) = (input.height(), input.width(), input.channels());
[INFO] [stdout] 315 | |     if h == 0 || w == 0 || out_h == 0 || out_w == 0 {
[INFO] [stdout] 316 | |         return None;
[INFO] [stdout] ...   |
[INFO] [stdout] 599 | |     ImageU8::new(out, out_h, out_w, c)
[INFO] [stdout] 600 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Bilinear resize on u8 image.`
[INFO] [stdout]     = help: ends near `NEON-vectorized V-pass on contiguous data, with row caching.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_resize.rs:313:1
[INFO] [stdout]     |
[INFO] [stdout] 313 | / pub fn resize_bilinear_u8(input: &ImageU8, out_h: usize, out_w: usize) -> Option<ImageU8> {
[INFO] [stdout] 314 | |     let (h, w, c) = (input.height(), input.width(), input.channels());
[INFO] [stdout] 315 | |     if h == 0 || w == 0 || out_h == 0 || out_w == 0 {
[INFO] [stdout] 316 | |         return None;
[INFO] [stdout] ...   |
[INFO] [stdout] 599 | |     ImageU8::new(out, out_h, out_w, c)
[INFO] [stdout] 600 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Bilinear resize on u8 image `[H,W,C]` to target dimensions.`
[INFO] [stdout]     = help: ends near `Bilinear resize on u8 image `[H,W,C]` to target dimensions.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_resize.rs:19:1
[INFO] [stdout]     |
[INFO] [stdout]  19 | / pub fn resize_nearest_u8(input: &ImageU8, out_h: usize, out_w: usize) -> Option<ImageU8> {
[INFO] [stdout]  20 | |     let (in_h, in_w, channels) = (input.height(), input.width(), input.channels());
[INFO] [stdout]  21 | |     if out_h == 0 || out_w == 0 || in_h == 0 || in_w == 0 {
[INFO] [stdout]  22 | |         return None;
[INFO] [stdout] ...   |
[INFO] [stdout] 103 | |     ImageU8::new(out, out_h, out_w, channels)
[INFO] [stdout] 104 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Nearest-neighbor resize on u8 image.`
[INFO] [stdout]     = help: ends near `Nearest-neighbour resize on u8 image `[H,W,C]` to target dimensions.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_resize.rs:19:1
[INFO] [stdout]     |
[INFO] [stdout]  19 | / pub fn resize_nearest_u8(input: &ImageU8, out_h: usize, out_w: usize) -> Option<ImageU8> {
[INFO] [stdout]  20 | |     let (in_h, in_w, channels) = (input.height(), input.width(), input.channels());
[INFO] [stdout]  21 | |     if out_h == 0 || out_w == 0 || in_h == 0 || in_w == 0 {
[INFO] [stdout]  22 | |         return None;
[INFO] [stdout] ...   |
[INFO] [stdout] 103 | |     ImageU8::new(out, out_h, out_w, channels)
[INFO] [stdout] 104 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Nearest-neighbour resize on u8 image `[H,W,C]` to target dimensions.`
[INFO] [stdout]     = help: ends near `Nearest-neighbour resize on u8 image `[H,W,C]` to target dimensions.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/u8_color.rs:14:1
[INFO] [stdout]    |
[INFO] [stdout] 14 | / pub fn rgb_to_hsv_u8(src: &[u8], width: usize, height: usize) -> Vec<u8> {
[INFO] [stdout] 15 | |     let npixels = width * height;
[INFO] [stdout] 16 | |     assert!(src.len() >= npixels * 3, "rgb_to_hsv_u8: src too short");
[INFO] [stdout] ...  |
[INFO] [stdout] 54 | |     out
[INFO] [stdout] 55 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `RGB to HSV conversion on u8 image.`
[INFO] [stdout]    = help: ends near `Converts RGB u8 image to HSV u8 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/u8_color.rs:14:1
[INFO] [stdout]    |
[INFO] [stdout] 14 | / pub fn rgb_to_hsv_u8(src: &[u8], width: usize, height: usize) -> Vec<u8> {
[INFO] [stdout] 15 | |     let npixels = width * height;
[INFO] [stdout] 16 | |     assert!(src.len() >= npixels * 3, "rgb_to_hsv_u8: src too short");
[INFO] [stdout] ...  |
[INFO] [stdout] 54 | |     out
[INFO] [stdout] 55 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Converts RGB u8 image to HSV u8 image.`
[INFO] [stdout]    = help: ends near `Converts RGB u8 image to HSV u8 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/u8_filters.rs:2458:1
[INFO] [stdout]      |
[INFO] [stdout] 2458 | / pub fn sobel_3x3_magnitude_u8(input: &ImageU8) -> Option<ImageU8> {
[INFO] [stdout] 2459 | |     if input.channels() != 1 {
[INFO] [stdout] 2460 | |         return None;
[INFO] [stdout] ...    |
[INFO] [stdout] 2524 | |     ImageU8::new(out, h, w, 1)
[INFO] [stdout] 2525 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `3x3 Sobel gradient magnitude on u8 image.`
[INFO] [stdout]      = help: ends near `Returns gradient magnitude clamped to `[0, 255]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/u8_filters.rs:2458:1
[INFO] [stdout]      |
[INFO] [stdout] 2458 | / pub fn sobel_3x3_magnitude_u8(input: &ImageU8) -> Option<ImageU8> {
[INFO] [stdout] 2459 | |     if input.channels() != 1 {
[INFO] [stdout] 2460 | |         return None;
[INFO] [stdout] ...    |
[INFO] [stdout] 2524 | |     ImageU8::new(out, h, w, 1)
[INFO] [stdout] 2525 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `3x3 Sobel gradient magnitude on single-channel u8 image.`
[INFO] [stdout]      = help: ends near `3x3 Sobel gradient magnitude on single-channel u8 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_features.rs:559:1
[INFO] [stdout]     |
[INFO] [stdout] 559 | / pub fn warp_perspective_u8(
[INFO] [stdout] 560 | |     image: &ImageU8,
[INFO] [stdout] 561 | |     h_matrix: &[f64; 9],
[INFO] [stdout] 562 | |     out_h: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 609 | |     ImageU8::new(out, out_h, out_w, channels).expect("output dimensions match data")
[INFO] [stdout] 610 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Perspective warp on u8 image.`
[INFO] [stdout]     = help: ends near `Uses bilinear interpolation. Out-of-bounds pixels are set to 0.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8_features.rs:559:1
[INFO] [stdout]     |
[INFO] [stdout] 559 | / pub fn warp_perspective_u8(
[INFO] [stdout] 560 | |     image: &ImageU8,
[INFO] [stdout] 561 | |     h_matrix: &[f64; 9],
[INFO] [stdout] 562 | |     out_h: usize,
[INFO] [stdout] ...   |
[INFO] [stdout] 609 | |     ImageU8::new(out, out_h, out_w, channels).expect("output dimensions match data")
[INFO] [stdout] 610 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Warp u8 single-channel image using a 3x3 homography matrix.`
[INFO] [stdout]     = help: ends near `Warp u8 single-channel image using a 3x3 homography matrix.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/color.rs:1609:1
[INFO] [stdout]      |
[INFO] [stdout] 1609 | / pub fn yuv_to_rgb(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1610 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1611 | |     if c != 3 {
[INFO] [stdout] 1612 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1641 | |     Tensor::from_vec(vec![h, w, 3], out).map_err(Into::into)
[INFO] [stdout] 1642 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Convert YUV to RGB. Input/output: `[H, W, 3]`.`
[INFO] [stdout]      = help: ends near `Converts YUV `[H, W, 3]` to RGB `[H, W, 3]` using BT.601 coefficients.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/color.rs:1609:1
[INFO] [stdout]      |
[INFO] [stdout] 1609 | / pub fn yuv_to_rgb(input: &Tensor) -> Result<Tensor, ImgProcError> {
[INFO] [stdout] 1610 | |     let (h, w, c) = hwc_shape(input)?;
[INFO] [stdout] 1611 | |     if c != 3 {
[INFO] [stdout] 1612 | |         return Err(ImgProcError::InvalidChannelCount {
[INFO] [stdout] ...    |
[INFO] [stdout] 1641 | |     Tensor::from_vec(vec![h, w, 3], out).map_err(Into::into)
[INFO] [stdout] 1642 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Converts YUV `[H, W, 3]` to RGB `[H, W, 3]` using BT.601 coefficients.`
[INFO] [stdout]      = help: ends near `Converts YUV `[H, W, 3]` to RGB `[H, W, 3]` using BT.601 coefficients.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8ops.rs:155:1
[INFO] [stdout]     |
[INFO] [stdout] 155 | / pub struct ImageF32 {
[INFO] [stdout] 156 | |     data: Vec<f32>,
[INFO] [stdout] 157 | |     height: usize,
[INFO] [stdout] 158 | |     width: usize,
[INFO] [stdout] 159 | |     channels: usize,
[INFO] [stdout] 160 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `HWC f32 image wrapper: `(width, height, channels, Vec<f32>)`.`
[INFO] [stdout]     = help: ends near `Simple f32 image wrapper (HWC layout, row-major). Zero overhead.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/u8ops.rs:155:1
[INFO] [stdout]     |
[INFO] [stdout] 155 | / pub struct ImageF32 {
[INFO] [stdout] 156 | |     data: Vec<f32>,
[INFO] [stdout] 157 | |     height: usize,
[INFO] [stdout] 158 | |     width: usize,
[INFO] [stdout] 159 | |     channels: usize,
[INFO] [stdout] 160 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `Simple f32 image wrapper (HWC layout, row-major). Zero overhead.`
[INFO] [stdout]     = help: ends near `Simple f32 image wrapper (HWC layout, row-major). Zero overhead.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/f32_ops.rs:496:1
[INFO] [stdout]     |
[INFO] [stdout] 496 | / pub fn box_blur_3x3_f32(input: &ImageF32) -> Option<ImageF32> {
[INFO] [stdout] 497 | |     if input.channels() != 1 {
[INFO] [stdout] 498 | |         return None;
[INFO] [stdout] ...   |
[INFO] [stdout] 550 | |     ImageF32::new(out, h, w, 1)
[INFO] [stdout] 551 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 box blur on f32 image.`
[INFO] [stdout]     = help: ends near `Direct `[1,1,1]`x`[1,1,1]`/9 kernel. Replicate border.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/f32_ops.rs:496:1
[INFO] [stdout]     |
[INFO] [stdout] 496 | / pub fn box_blur_3x3_f32(input: &ImageF32) -> Option<ImageF32> {
[INFO] [stdout] 497 | |     if input.channels() != 1 {
[INFO] [stdout] 498 | |         return None;
[INFO] [stdout] ...   |
[INFO] [stdout] 550 | |     ImageF32::new(out, h, w, 1)
[INFO] [stdout] 551 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 box blur on single-channel f32 image.`
[INFO] [stdout]     = help: ends near `3x3 box blur on single-channel f32 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/f32_ops.rs:810:1
[INFO] [stdout]     |
[INFO] [stdout] 810 | / pub fn dilate_3x3_f32(input: &ImageF32) -> Option<ImageF32> {
[INFO] [stdout] 811 | |     if input.channels() != 1 {
[INFO] [stdout] 812 | |         return None;
[INFO] [stdout] ...   |
[INFO] [stdout] 859 | |     ImageF32::new(out, h, w, 1)
[INFO] [stdout] 860 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 dilation on f32 image.`
[INFO] [stdout]     = help: ends near `3x3 dilation (max) on single-channel f32 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/f32_ops.rs:810:1
[INFO] [stdout]     |
[INFO] [stdout] 810 | / pub fn dilate_3x3_f32(input: &ImageF32) -> Option<ImageF32> {
[INFO] [stdout] 811 | |     if input.channels() != 1 {
[INFO] [stdout] 812 | |         return None;
[INFO] [stdout] ...   |
[INFO] [stdout] 859 | |     ImageF32::new(out, h, w, 1)
[INFO] [stdout] 860 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 dilation (max) on single-channel f32 image.`
[INFO] [stdout]     = help: ends near `3x3 dilation (max) on single-channel f32 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/f32_ops.rs:177:1
[INFO] [stdout]     |
[INFO] [stdout] 177 | / pub fn gaussian_blur_3x3_f32(input: &ImageF32) -> Option<ImageF32> {
[INFO] [stdout] 178 | |     if input.channels() != 1 {
[INFO] [stdout] 179 | |         return None;
[INFO] [stdout] ...   |
[INFO] [stdout] 228 | |     ImageF32::new(out, h, w, 1)
[INFO] [stdout] 229 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 Gaussian blur on f32 image.`
[INFO] [stdout]     = help: ends near `Direct `[1,2,1]`x`[1,2,1]`/16 kernel. Replicate border.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]    --> src/ops/f32_ops.rs:177:1
[INFO] [stdout]     |
[INFO] [stdout] 177 | / pub fn gaussian_blur_3x3_f32(input: &ImageF32) -> Option<ImageF32> {
[INFO] [stdout] 178 | |     if input.channels() != 1 {
[INFO] [stdout] 179 | |         return None;
[INFO] [stdout] ...   |
[INFO] [stdout] 228 | |     ImageF32::new(out, h, w, 1)
[INFO] [stdout] 229 | | }
[INFO] [stdout]     | |_^
[INFO] [stdout]     |
[INFO] [stdout]     = help: the way this is parsed might change in the future
[INFO] [stdout]     = help: starts near `3x3 Gaussian blur on single-channel f32 image.`
[INFO] [stdout]     = help: ends near `3x3 Gaussian blur on single-channel f32 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/f32_ops.rs:25:1
[INFO] [stdout]    |
[INFO] [stdout] 25 | / pub fn grayscale_f32(input: &ImageF32) -> Option<ImageF32> {
[INFO] [stdout] 26 | |     if input.channels() != 3 {
[INFO] [stdout] 27 | |         return None;
[INFO] [stdout] ...  |
[INFO] [stdout] 76 | |     ImageF32::new(out, h, w, 1)
[INFO] [stdout] 77 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Convert f32 RGB image to grayscale.`
[INFO] [stdout]    = help: ends near `Uses BT.601: gray = 0.299*R + 0.587*G + 0.114*B.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]   --> src/ops/f32_ops.rs:25:1
[INFO] [stdout]    |
[INFO] [stdout] 25 | / pub fn grayscale_f32(input: &ImageF32) -> Option<ImageF32> {
[INFO] [stdout] 26 | |     if input.channels() != 3 {
[INFO] [stdout] 27 | |         return None;
[INFO] [stdout] ...  |
[INFO] [stdout] 76 | |     ImageF32::new(out, h, w, 1)
[INFO] [stdout] 77 | | }
[INFO] [stdout]    | |_^
[INFO] [stdout]    |
[INFO] [stdout]    = help: the way this is parsed might change in the future
[INFO] [stdout]    = help: starts near `Converts RGB f32 image `[H,W,3]` to grayscale `[H,W,1]`.`
[INFO] [stdout]    = help: ends near `Converts RGB f32 image `[H,W,3]` to grayscale `[H,W,1]`.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/f32_ops.rs:1096:1
[INFO] [stdout]      |
[INFO] [stdout] 1096 | / pub fn sobel_3x3_f32(input: &ImageF32) -> Option<ImageF32> {
[INFO] [stdout] 1097 | |     if input.channels() != 1 {
[INFO] [stdout] 1098 | |         return None;
[INFO] [stdout] ...    |
[INFO] [stdout] 1148 | |     ImageF32::new(out, h, w, 1)
[INFO] [stdout] 1149 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `3x3 Sobel gradient magnitude on f32 image.`
[INFO] [stdout]      = help: ends near `Returns `|Gx| + |Gy|` approximation. Border pixels are zero.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/f32_ops.rs:1096:1
[INFO] [stdout]      |
[INFO] [stdout] 1096 | / pub fn sobel_3x3_f32(input: &ImageF32) -> Option<ImageF32> {
[INFO] [stdout] 1097 | |     if input.channels() != 1 {
[INFO] [stdout] 1098 | |         return None;
[INFO] [stdout] ...    |
[INFO] [stdout] 1148 | |     ImageF32::new(out, h, w, 1)
[INFO] [stdout] 1149 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `3x3 Sobel gradient magnitude on single-channel f32 image.`
[INFO] [stdout]      = help: ends near `3x3 Sobel gradient magnitude on single-channel f32 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/f32_ops.rs:1274:1
[INFO] [stdout]      |
[INFO] [stdout] 1274 | / pub fn threshold_binary_f32(input: &ImageF32, thresh: f32, max_val: f32) -> Option<ImageF32> {
[INFO] [stdout] 1275 | |     if input.channels() != 1 {
[INFO] [stdout] 1276 | |         return None;
[INFO] [stdout] ...    |
[INFO] [stdout] 1318 | |     ImageF32::new(out, h, w, 1)
[INFO] [stdout] 1319 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Binary threshold on f32 image.`
[INFO] [stdout]      = help: ends near `Pixels > thresh become max_val, otherwise 0.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error: markdown element starts on one item and ends on another
[INFO] [stdout]     --> src/ops/f32_ops.rs:1274:1
[INFO] [stdout]      |
[INFO] [stdout] 1274 | / pub fn threshold_binary_f32(input: &ImageF32, thresh: f32, max_val: f32) -> Option<ImageF32> {
[INFO] [stdout] 1275 | |     if input.channels() != 1 {
[INFO] [stdout] 1276 | |         return None;
[INFO] [stdout] ...    |
[INFO] [stdout] 1318 | |     ImageF32::new(out, h, w, 1)
[INFO] [stdout] 1319 | | }
[INFO] [stdout]      | |_^
[INFO] [stdout]      |
[INFO] [stdout]      = help: the way this is parsed might change in the future
[INFO] [stdout]      = help: starts near `Binary threshold on single-channel f32 image.`
[INFO] [stdout]      = help: ends near `Binary threshold on single-channel f32 image.`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr] error: could not document `yscv-imgproc`
[INFO] running `Command { std: "docker" "inspect" "2146229a75751cf09c841bada97bb88246ed4054735c1f21aa85755510dd291c", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "2146229a75751cf09c841bada97bb88246ed4054735c1f21aa85755510dd291c", kill_on_drop: false }`
[INFO] [stdout] 2146229a75751cf09c841bada97bb88246ed4054735c1f21aa85755510dd291c
