Repository files navigation

G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs

GitHub Repo starsGitHub Repo forksPyPI versionProject PageLicense: Apache 2.0Last CommitPlatform
A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The classic algorithm is proposed by Ackermann in DIGITAL IMAGE CORRELATION: PERFORMANCE AND POTENTIAL APPLICATION IN PHOTOGRAMMETRY (1984), where the correspondence search reduces to a one-dimensional problem along epipolar lines, enabling both fast convergence and high accuracy.

We provide the source code in C++ and a Python API library built upon it. A PyQt Demo Application and the CUDA-based GPU-accelerated version is also provided.
Up to now we have successfully tested the C++ and Python built from source code on Windows 10 and Windows 11.

Project Page
Contributors: Haojun Tang, Jiahao Zhou
Acknowledgements: Thanks to the guidance of Yunsheng Zhang from Central South University.

About the Project

Environment

Application Structure

CUDA Executions

Some Results

Matching Results

Left ImageRight Image

Time Costs

SetupsCPUGPU
Time (sec)332.270.621

Improved by 500+ times in our GPU implementation!

Core Algorithm tested in C++ (only CPU-based)

Prerequisites
MSVC (Visual Studio 2022, with C++ CMake tools), CMake ≥ 3.20, and the source code:

git clone https://github.com/DonaldTrump-coder/G-LSMEI --recursive

Build for the Code
In the project directory, run the following commands:

mkdir build
cd build
cmake .. -G "Visual Studio 17 2022"
cmake --build . --config Release
.\Release\leastsquares_matching.exe

The output is from the main function in core\src\test.cpp
Use the C++ source code for testing the algorithm.

Image Matching Application Deployment (CPU and GPU support)

Prerequisites
You also need MSVC and CMake, conda (or any Python environment), as well as nvcc for CUDA (Already successfully tested on CUDA 12.4). Install them and start to build!

1. Install the Requirement Packages for Python
In the project directory, run

conda create -n matching python=3.11
conda activate matching
pip install -r requirements.txt

2. Build the C++ and CUDA Source for Python Application

cd python
python setup.py bdist_wheel
python -m pip install (Get-ChildItem dist\glsmei-*.whl).FullName --force-reinstall
cd ..

Then the installation of glsmei is done.

3. Use the Application in Python
run

python main.py

API Reference

Installation from pip (If your Python and CUDA environment is supported): pip install glsmei
Verify installation: python -c "import lsmatching; print(lsmatching.__version__)"

Matching in CPU

Matching(left_image_path: str, right_image_path: str)
APIsParamsReturnsDescription
set_params(windowsize, d_corr_threshold)int=15, float=0.04Set template window size and correlation change threshold
set_matching_params(windowsize, corr_threshold)int=3, float=0.7Set initial matching parameters
set_centers(x1, y1, x2, y2)int × 4Set initial conjugate points on left/right images
calculate()Run single-point least-squares matching
get_left_window()np.ndarrayGet the left image matching window
get_right_window()np.ndarrayGet the right image matching window
get_matched_points(savepath)strExport matching results
get_matched_x()floatMatched point x-coordinate
get_matched_y()floatMatched point y-coordinate
get_delta0()floatStandard error of unit weight
get_deltag()floatStandard error of window
get_deltax()floatStandard error of parameters
get_SNR()floatSNR
get_h0() / get_h1()floatRadiometric distortion parameters
get_a0() / get_a1() / get_a2()floatAffine parameters (left → right, x-direction)
get_b0() / get_b1() / get_b2()floatAffine parameters (left → right, y-direction)
gpu_device_count()intNumber of available GPUs

Matching in GPU

batch_adjust_gpu(window_size=15, d_corr=0.04, max_iter=20, matching_wsize=3, corr_threshold=0.7, savepath=None)

GPU batch pipeline: Feature Extraction → Correlation Matching → Least-Squares Refinement

ParameterTypeDefaultDescription
window_sizeint15Least-squares refinement template window size
d_corrfloat0.04Correlation change threshold (convergence criterion)
max_iterint20Maximum iteration count
matching_wsizeint3Initial correlation matching template window size
corr_thresholdfloat0.7Initial matching correlation threshold
savepathstrNoneOutput save path

License

This project is licensed under the Apache License 2.0. See LICENSE details.

Citation

If you use our work or our data in your research, please cite:

@misc{Tang2026GLSMEI,
title = {G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs},
author = {Tang, Haojun and Zhou, Jiahao},
year = {2026},
howpublished = {\url{https://github.com/DonaldTrump-coder/G-LSMEI}},
note = {Version 1.0.2. Apache License 2.0}
}

About

A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The algorithm in C++, and a Python wrapper with GPU-acceleration is provided to expose it as a third-party library.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs

GitHub Repo starsGitHub Repo forksPyPI versionProject PageLicense: Apache 2.0Last CommitPlatform
A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The classic algorithm is proposed by Ackermann in DIGITAL IMAGE CORRELATION: PERFORMANCE AND POTENTIAL APPLICATION IN PHOTOGRAMMETRY (1984), where the correspondence search reduces to a one-dimensional problem along epipolar lines, enabling both fast convergence and high accuracy.

We provide the source code in C++ and a Python API library built upon it. A PyQt Demo Application and the CUDA-based GPU-accelerated version is also provided.
Up to now we have successfully tested the C++ and Python built from source code on Windows 10 and Windows 11.

Project Page
Contributors: Haojun Tang, Jiahao Zhou
Acknowledgements: Thanks to the guidance of Yunsheng Zhang from Central South University.

About the Project

Environment

Application Structure

CUDA Executions

Some Results

Matching Results

Left ImageRight Image

Time Costs

SetupsCPUGPU
Time (sec)332.270.621

Improved by 500+ times in our GPU implementation!

Core Algorithm tested in C++ (only CPU-based)

Prerequisites
MSVC (Visual Studio 2022, with C++ CMake tools), CMake ≥ 3.20, and the source code:

git clone https://github.com/DonaldTrump-coder/G-LSMEI --recursive

Build for the Code
In the project directory, run the following commands:

mkdir build
cd build
cmake .. -G "Visual Studio 17 2022"
cmake --build . --config Release
.\Release\leastsquares_matching.exe

The output is from the main function in core\src\test.cpp
Use the C++ source code for testing the algorithm.

Image Matching Application Deployment (CPU and GPU support)

Prerequisites
You also need MSVC and CMake, conda (or any Python environment), as well as nvcc for CUDA (Already successfully tested on CUDA 12.4). Install them and start to build!

1. Install the Requirement Packages for Python
In the project directory, run

conda create -n matching python=3.11
conda activate matching
pip install -r requirements.txt

2. Build the C++ and CUDA Source for Python Application

cd python
python setup.py bdist_wheel
python -m pip install (Get-ChildItem dist\glsmei-*.whl).FullName --force-reinstall
cd ..

Then the installation of glsmei is done.

3. Use the Application in Python
run

python main.py

API Reference

Installation from pip (If your Python and CUDA environment is supported): pip install glsmei
Verify installation: python -c "import lsmatching; print(lsmatching.__version__)"

Matching in CPU

Matching(left_image_path: str, right_image_path: str)
APIsParamsReturnsDescription
set_params(windowsize, d_corr_threshold)int=15, float=0.04Set template window size and correlation change threshold
set_matching_params(windowsize, corr_threshold)int=3, float=0.7Set initial matching parameters
set_centers(x1, y1, x2, y2)int × 4Set initial conjugate points on left/right images
calculate()Run single-point least-squares matching
get_left_window()np.ndarrayGet the left image matching window
get_right_window()np.ndarrayGet the right image matching window
get_matched_points(savepath)strExport matching results
get_matched_x()floatMatched point x-coordinate
get_matched_y()floatMatched point y-coordinate
get_delta0()floatStandard error of unit weight
get_deltag()floatStandard error of window
get_deltax()floatStandard error of parameters
get_SNR()floatSNR
get_h0() / get_h1()floatRadiometric distortion parameters
get_a0() / get_a1() / get_a2()floatAffine parameters (left → right, x-direction)
get_b0() / get_b1() / get_b2()floatAffine parameters (left → right, y-direction)
gpu_device_count()intNumber of available GPUs

Matching in GPU

batch_adjust_gpu(window_size=15, d_corr=0.04, max_iter=20, matching_wsize=3, corr_threshold=0.7, savepath=None)

GPU batch pipeline: Feature Extraction → Correlation Matching → Least-Squares Refinement

ParameterTypeDefaultDescription
window_sizeint15Least-squares refinement template window size
d_corrfloat0.04Correlation change threshold (convergence criterion)
max_iterint20Maximum iteration count
matching_wsizeint3Initial correlation matching template window size
corr_thresholdfloat0.7Initial matching correlation threshold
savepathstrNoneOutput save path

License

This project is licensed under the Apache License 2.0. See LICENSE details.

Citation

If you use our work or our data in your research, please cite:

@misc{Tang2026GLSMEI,
title = {G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs},
author = {Tang, Haojun and Zhou, Jiahao},
year = {2026},
howpublished = {\url{https://github.com/DonaldTrump-coder/G-LSMEI}},
note = {Version 1.0.2. Apache License 2.0}
}

About

A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The algorithm in C++, and a Python wrapper with GPU-acceleration is provided to expose it as a third-party library.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs

GitHub Repo starsGitHub Repo forksPyPI versionProject PageLicense: Apache 2.0Last CommitPlatform
A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The classic algorithm is proposed by Ackermann in DIGITAL IMAGE CORRELATION: PERFORMANCE AND POTENTIAL APPLICATION IN PHOTOGRAMMETRY (1984), where the correspondence search reduces to a one-dimensional problem along epipolar lines, enabling both fast convergence and high accuracy.

We provide the source code in C++ and a Python API library built upon it. A PyQt Demo Application and the CUDA-based GPU-accelerated version is also provided.
Up to now we have successfully tested the C++ and Python built from source code on Windows 10 and Windows 11.

Project Page
Contributors: Haojun Tang, Jiahao Zhou
Acknowledgements: Thanks to the guidance of Yunsheng Zhang from Central South University.

About the Project

Environment

Application Structure

CUDA Executions

Some Results

Matching Results

Left ImageRight Image

Time Costs

SetupsCPUGPU
Time (sec)332.270.621

Improved by 500+ times in our GPU implementation!

Core Algorithm tested in C++ (only CPU-based)

Prerequisites
MSVC (Visual Studio 2022, with C++ CMake tools), CMake ≥ 3.20, and the source code:

git clone https://github.com/DonaldTrump-coder/G-LSMEI --recursive

Build for the Code
In the project directory, run the following commands:

mkdir build
cd build
cmake .. -G "Visual Studio 17 2022"
cmake --build . --config Release
.\Release\leastsquares_matching.exe

The output is from the main function in core\src\test.cpp
Use the C++ source code for testing the algorithm.

Image Matching Application Deployment (CPU and GPU support)

Prerequisites
You also need MSVC and CMake, conda (or any Python environment), as well as nvcc for CUDA (Already successfully tested on CUDA 12.4). Install them and start to build!

1. Install the Requirement Packages for Python
In the project directory, run

conda create -n matching python=3.11
conda activate matching
pip install -r requirements.txt

2. Build the C++ and CUDA Source for Python Application

cd python
python setup.py bdist_wheel
python -m pip install (Get-ChildItem dist\glsmei-*.whl).FullName --force-reinstall
cd ..

Then the installation of glsmei is done.

3. Use the Application in Python
run

python main.py

API Reference

Installation from pip (If your Python and CUDA environment is supported): pip install glsmei
Verify installation: python -c "import lsmatching; print(lsmatching.__version__)"

Matching in CPU

Matching(left_image_path: str, right_image_path: str)
APIsParamsReturnsDescription
set_params(windowsize, d_corr_threshold)int=15, float=0.04Set template window size and correlation change threshold
set_matching_params(windowsize, corr_threshold)int=3, float=0.7Set initial matching parameters
set_centers(x1, y1, x2, y2)int × 4Set initial conjugate points on left/right images
calculate()Run single-point least-squares matching
get_left_window()np.ndarrayGet the left image matching window
get_right_window()np.ndarrayGet the right image matching window
get_matched_points(savepath)strExport matching results
get_matched_x()floatMatched point x-coordinate
get_matched_y()floatMatched point y-coordinate
get_delta0()floatStandard error of unit weight
get_deltag()floatStandard error of window
get_deltax()floatStandard error of parameters
get_SNR()floatSNR
get_h0() / get_h1()floatRadiometric distortion parameters
get_a0() / get_a1() / get_a2()floatAffine parameters (left → right, x-direction)
get_b0() / get_b1() / get_b2()floatAffine parameters (left → right, y-direction)
gpu_device_count()intNumber of available GPUs

Matching in GPU

batch_adjust_gpu(window_size=15, d_corr=0.04, max_iter=20, matching_wsize=3, corr_threshold=0.7, savepath=None)

GPU batch pipeline: Feature Extraction → Correlation Matching → Least-Squares Refinement

ParameterTypeDefaultDescription
window_sizeint15Least-squares refinement template window size
d_corrfloat0.04Correlation change threshold (convergence criterion)
max_iterint20Maximum iteration count
matching_wsizeint3Initial correlation matching template window size
corr_thresholdfloat0.7Initial matching correlation threshold
savepathstrNoneOutput save path

License

This project is licensed under the Apache License 2.0. See LICENSE details.

Citation

If you use our work or our data in your research, please cite:

@misc{Tang2026GLSMEI,
title = {G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs},
author = {Tang, Haojun and Zhou, Jiahao},
year = {2026},
howpublished = {\url{https://github.com/DonaldTrump-coder/G-LSMEI}},
note = {Version 1.0.2. Apache License 2.0}
}

About

A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The algorithm in C++, and a Python wrapper with GPU-acceleration is provided to expose it as a third-party library.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs

GitHub Repo starsGitHub Repo forksPyPI versionProject PageLicense: Apache 2.0Last CommitPlatform
A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The classic algorithm is proposed by Ackermann in DIGITAL IMAGE CORRELATION: PERFORMANCE AND POTENTIAL APPLICATION IN PHOTOGRAMMETRY (1984), where the correspondence search reduces to a one-dimensional problem along epipolar lines, enabling both fast convergence and high accuracy.

We provide the source code in C++ and a Python API library built upon it. A PyQt Demo Application and the CUDA-based GPU-accelerated version is also provided.
Up to now we have successfully tested the C++ and Python built from source code on Windows 10 and Windows 11.

Project Page
Contributors: Haojun Tang, Jiahao Zhou
Acknowledgements: Thanks to the guidance of Yunsheng Zhang from Central South University.

About the Project

Environment

Application Structure

CUDA Executions

Some Results

Matching Results

Left ImageRight Image

Time Costs

SetupsCPUGPU
Time (sec)332.270.621

Improved by 500+ times in our GPU implementation!

Core Algorithm tested in C++ (only CPU-based)

Prerequisites
MSVC (Visual Studio 2022, with C++ CMake tools), CMake ≥ 3.20, and the source code:

git clone https://github.com/DonaldTrump-coder/G-LSMEI --recursive

Build for the Code
In the project directory, run the following commands:

mkdir build
cd build
cmake .. -G "Visual Studio 17 2022"
cmake --build . --config Release
.\Release\leastsquares_matching.exe

The output is from the main function in core\src\test.cpp
Use the C++ source code for testing the algorithm.

Image Matching Application Deployment (CPU and GPU support)

Prerequisites
You also need MSVC and CMake, conda (or any Python environment), as well as nvcc for CUDA (Already successfully tested on CUDA 12.4). Install them and start to build!

1. Install the Requirement Packages for Python
In the project directory, run

conda create -n matching python=3.11
conda activate matching
pip install -r requirements.txt

2. Build the C++ and CUDA Source for Python Application

cd python
python setup.py bdist_wheel
python -m pip install (Get-ChildItem dist\glsmei-*.whl).FullName --force-reinstall
cd ..

Then the installation of glsmei is done.

3. Use the Application in Python
run

python main.py

API Reference

Installation from pip (If your Python and CUDA environment is supported): pip install glsmei
Verify installation: python -c "import lsmatching; print(lsmatching.__version__)"

Matching in CPU

Matching(left_image_path: str, right_image_path: str)
APIsParamsReturnsDescription
set_params(windowsize, d_corr_threshold)int=15, float=0.04Set template window size and correlation change threshold
set_matching_params(windowsize, corr_threshold)int=3, float=0.7Set initial matching parameters
set_centers(x1, y1, x2, y2)int × 4Set initial conjugate points on left/right images
calculate()Run single-point least-squares matching
get_left_window()np.ndarrayGet the left image matching window
get_right_window()np.ndarrayGet the right image matching window
get_matched_points(savepath)strExport matching results
get_matched_x()floatMatched point x-coordinate
get_matched_y()floatMatched point y-coordinate
get_delta0()floatStandard error of unit weight
get_deltag()floatStandard error of window
get_deltax()floatStandard error of parameters
get_SNR()floatSNR
get_h0() / get_h1()floatRadiometric distortion parameters
get_a0() / get_a1() / get_a2()floatAffine parameters (left → right, x-direction)
get_b0() / get_b1() / get_b2()floatAffine parameters (left → right, y-direction)
gpu_device_count()intNumber of available GPUs

Matching in GPU

batch_adjust_gpu(window_size=15, d_corr=0.04, max_iter=20, matching_wsize=3, corr_threshold=0.7, savepath=None)

GPU batch pipeline: Feature Extraction → Correlation Matching → Least-Squares Refinement

ParameterTypeDefaultDescription
window_sizeint15Least-squares refinement template window size
d_corrfloat0.04Correlation change threshold (convergence criterion)
max_iterint20Maximum iteration count
matching_wsizeint3Initial correlation matching template window size
corr_thresholdfloat0.7Initial matching correlation threshold
savepathstrNoneOutput save path

License

This project is licensed under the Apache License 2.0. See LICENSE details.

Citation

If you use our work or our data in your research, please cite:

@misc{Tang2026GLSMEI,
title = {G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs},
author = {Tang, Haojun and Zhou, Jiahao},
year = {2026},
howpublished = {\url{https://github.com/DonaldTrump-coder/G-LSMEI}},
note = {Version 1.0.2. Apache License 2.0}
}

About

A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The algorithm in C++, and a Python wrapper with GPU-acceleration is provided to expose it as a third-party library.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs

GitHub Repo starsGitHub Repo forksPyPI versionProject PageLicense: Apache 2.0Last CommitPlatform
A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The classic algorithm is proposed by Ackermann in DIGITAL IMAGE CORRELATION: PERFORMANCE AND POTENTIAL APPLICATION IN PHOTOGRAMMETRY (1984), where the correspondence search reduces to a one-dimensional problem along epipolar lines, enabling both fast convergence and high accuracy.

We provide the source code in C++ and a Python API library built upon it. A PyQt Demo Application and the CUDA-based GPU-accelerated version is also provided.
Up to now we have successfully tested the C++ and Python built from source code on Windows 10 and Windows 11.

Project Page
Contributors: Haojun Tang, Jiahao Zhou
Acknowledgements: Thanks to the guidance of Yunsheng Zhang from Central South University.

About the Project

Environment

Application Structure

CUDA Executions

Some Results

Matching Results

Left ImageRight Image

Time Costs

SetupsCPUGPU
Time (sec)332.270.621

Improved by 500+ times in our GPU implementation!

Core Algorithm tested in C++ (only CPU-based)

Prerequisites
MSVC (Visual Studio 2022, with C++ CMake tools), CMake ≥ 3.20, and the source code:

git clone https://github.com/DonaldTrump-coder/G-LSMEI --recursive

Build for the Code
In the project directory, run the following commands:

mkdir build
cd build
cmake .. -G "Visual Studio 17 2022"
cmake --build . --config Release
.\Release\leastsquares_matching.exe

The output is from the main function in core\src\test.cpp
Use the C++ source code for testing the algorithm.

Image Matching Application Deployment (CPU and GPU support)

Prerequisites
You also need MSVC and CMake, conda (or any Python environment), as well as nvcc for CUDA (Already successfully tested on CUDA 12.4). Install them and start to build!

1. Install the Requirement Packages for Python
In the project directory, run

conda create -n matching python=3.11
conda activate matching
pip install -r requirements.txt

2. Build the C++ and CUDA Source for Python Application

cd python
python setup.py bdist_wheel
python -m pip install (Get-ChildItem dist\glsmei-*.whl).FullName --force-reinstall
cd ..

Then the installation of glsmei is done.

3. Use the Application in Python
run

python main.py

API Reference

Installation from pip (If your Python and CUDA environment is supported): pip install glsmei
Verify installation: python -c "import lsmatching; print(lsmatching.__version__)"

Matching in CPU

Matching(left_image_path: str, right_image_path: str)
APIsParamsReturnsDescription
set_params(windowsize, d_corr_threshold)int=15, float=0.04Set template window size and correlation change threshold
set_matching_params(windowsize, corr_threshold)int=3, float=0.7Set initial matching parameters
set_centers(x1, y1, x2, y2)int × 4Set initial conjugate points on left/right images
calculate()Run single-point least-squares matching
get_left_window()np.ndarrayGet the left image matching window
get_right_window()np.ndarrayGet the right image matching window
get_matched_points(savepath)strExport matching results
get_matched_x()floatMatched point x-coordinate
get_matched_y()floatMatched point y-coordinate
get_delta0()floatStandard error of unit weight
get_deltag()floatStandard error of window
get_deltax()floatStandard error of parameters
get_SNR()floatSNR
get_h0() / get_h1()floatRadiometric distortion parameters
get_a0() / get_a1() / get_a2()floatAffine parameters (left → right, x-direction)
get_b0() / get_b1() / get_b2()floatAffine parameters (left → right, y-direction)
gpu_device_count()intNumber of available GPUs

Matching in GPU

batch_adjust_gpu(window_size=15, d_corr=0.04, max_iter=20, matching_wsize=3, corr_threshold=0.7, savepath=None)

GPU batch pipeline: Feature Extraction → Correlation Matching → Least-Squares Refinement

ParameterTypeDefaultDescription
window_sizeint15Least-squares refinement template window size
d_corrfloat0.04Correlation change threshold (convergence criterion)
max_iterint20Maximum iteration count
matching_wsizeint3Initial correlation matching template window size
corr_thresholdfloat0.7Initial matching correlation threshold
savepathstrNoneOutput save path

License

This project is licensed under the Apache License 2.0. See LICENSE details.

Citation

If you use our work or our data in your research, please cite:

@misc{Tang2026GLSMEI,
title = {G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs},
author = {Tang, Haojun and Zhou, Jiahao},
year = {2026},
howpublished = {\url{https://github.com/DonaldTrump-coder/G-LSMEI}},
note = {Version 1.0.2. Apache License 2.0}
}

About

A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The algorithm in C++, and a Python wrapper with GPU-acceleration is provided to expose it as a third-party library.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs

GitHub Repo starsGitHub Repo forksPyPI versionProject PageLicense: Apache 2.0Last CommitPlatform
A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The classic algorithm is proposed by Ackermann in DIGITAL IMAGE CORRELATION: PERFORMANCE AND POTENTIAL APPLICATION IN PHOTOGRAMMETRY (1984), where the correspondence search reduces to a one-dimensional problem along epipolar lines, enabling both fast convergence and high accuracy.

We provide the source code in C++ and a Python API library built upon it. A PyQt Demo Application and the CUDA-based GPU-accelerated version is also provided.
Up to now we have successfully tested the C++ and Python built from source code on Windows 10 and Windows 11.

Project Page
Contributors: Haojun Tang, Jiahao Zhou
Acknowledgements: Thanks to the guidance of Yunsheng Zhang from Central South University.

About the Project

Environment

Application Structure

CUDA Executions

Some Results

Matching Results

Left ImageRight Image

Time Costs

SetupsCPUGPU
Time (sec)332.270.621

Improved by 500+ times in our GPU implementation!

Core Algorithm tested in C++ (only CPU-based)

Prerequisites
MSVC (Visual Studio 2022, with C++ CMake tools), CMake ≥ 3.20, and the source code:

git clone https://github.com/DonaldTrump-coder/G-LSMEI --recursive

Build for the Code
In the project directory, run the following commands:

mkdir build
cd build
cmake .. -G "Visual Studio 17 2022"
cmake --build . --config Release
.\Release\leastsquares_matching.exe

The output is from the main function in core\src\test.cpp
Use the C++ source code for testing the algorithm.

Image Matching Application Deployment (CPU and GPU support)

Prerequisites
You also need MSVC and CMake, conda (or any Python environment), as well as nvcc for CUDA (Already successfully tested on CUDA 12.4). Install them and start to build!

1. Install the Requirement Packages for Python
In the project directory, run

conda create -n matching python=3.11
conda activate matching
pip install -r requirements.txt

2. Build the C++ and CUDA Source for Python Application

cd python
python setup.py bdist_wheel
python -m pip install (Get-ChildItem dist\glsmei-*.whl).FullName --force-reinstall
cd ..

Then the installation of glsmei is done.

3. Use the Application in Python
run

python main.py

API Reference

Installation from pip (If your Python and CUDA environment is supported): pip install glsmei
Verify installation: python -c "import lsmatching; print(lsmatching.__version__)"

Matching in CPU

Matching(left_image_path: str, right_image_path: str)
APIsParamsReturnsDescription
set_params(windowsize, d_corr_threshold)int=15, float=0.04Set template window size and correlation change threshold
set_matching_params(windowsize, corr_threshold)int=3, float=0.7Set initial matching parameters
set_centers(x1, y1, x2, y2)int × 4Set initial conjugate points on left/right images
calculate()Run single-point least-squares matching
get_left_window()np.ndarrayGet the left image matching window
get_right_window()np.ndarrayGet the right image matching window
get_matched_points(savepath)strExport matching results
get_matched_x()floatMatched point x-coordinate
get_matched_y()floatMatched point y-coordinate
get_delta0()floatStandard error of unit weight
get_deltag()floatStandard error of window
get_deltax()floatStandard error of parameters
get_SNR()floatSNR
get_h0() / get_h1()floatRadiometric distortion parameters
get_a0() / get_a1() / get_a2()floatAffine parameters (left → right, x-direction)
get_b0() / get_b1() / get_b2()floatAffine parameters (left → right, y-direction)
gpu_device_count()intNumber of available GPUs

Matching in GPU

batch_adjust_gpu(window_size=15, d_corr=0.04, max_iter=20, matching_wsize=3, corr_threshold=0.7, savepath=None)

GPU batch pipeline: Feature Extraction → Correlation Matching → Least-Squares Refinement

ParameterTypeDefaultDescription
window_sizeint15Least-squares refinement template window size
d_corrfloat0.04Correlation change threshold (convergence criterion)
max_iterint20Maximum iteration count
matching_wsizeint3Initial correlation matching template window size
corr_thresholdfloat0.7Initial matching correlation threshold
savepathstrNoneOutput save path

License

This project is licensed under the Apache License 2.0. See LICENSE details.

Citation

If you use our work or our data in your research, please cite:

@misc{Tang2026GLSMEI,
title = {G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs},
author = {Tang, Haojun and Zhou, Jiahao},
year = {2026},
howpublished = {\url{https://github.com/DonaldTrump-coder/G-LSMEI}},
note = {Version 1.0.2. Apache License 2.0}
}

About

A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The algorithm in C++, and a Python wrapper with GPU-acceleration is provided to expose it as a third-party library.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs

GitHub Repo starsGitHub Repo forksPyPI versionProject PageLicense: Apache 2.0Last CommitPlatform
A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The classic algorithm is proposed by Ackermann in DIGITAL IMAGE CORRELATION: PERFORMANCE AND POTENTIAL APPLICATION IN PHOTOGRAMMETRY (1984), where the correspondence search reduces to a one-dimensional problem along epipolar lines, enabling both fast convergence and high accuracy.

We provide the source code in C++ and a Python API library built upon it. A PyQt Demo Application and the CUDA-based GPU-accelerated version is also provided.
Up to now we have successfully tested the C++ and Python built from source code on Windows 10 and Windows 11.

Project Page
Contributors: Haojun Tang, Jiahao Zhou
Acknowledgements: Thanks to the guidance of Yunsheng Zhang from Central South University.

About the Project

Environment

Application Structure

CUDA Executions

Some Results

Matching Results

Left ImageRight Image

Time Costs

SetupsCPUGPU
Time (sec)332.270.621

Improved by 500+ times in our GPU implementation!

Core Algorithm tested in C++ (only CPU-based)

Prerequisites
MSVC (Visual Studio 2022, with C++ CMake tools), CMake ≥ 3.20, and the source code:

git clone https://github.com/DonaldTrump-coder/G-LSMEI --recursive

Build for the Code
In the project directory, run the following commands:

mkdir build
cd build
cmake .. -G "Visual Studio 17 2022"
cmake --build . --config Release
.\Release\leastsquares_matching.exe

The output is from the main function in core\src\test.cpp
Use the C++ source code for testing the algorithm.

Image Matching Application Deployment (CPU and GPU support)

Prerequisites
You also need MSVC and CMake, conda (or any Python environment), as well as nvcc for CUDA (Already successfully tested on CUDA 12.4). Install them and start to build!

1. Install the Requirement Packages for Python
In the project directory, run

conda create -n matching python=3.11
conda activate matching
pip install -r requirements.txt

2. Build the C++ and CUDA Source for Python Application

cd python
python setup.py bdist_wheel
python -m pip install (Get-ChildItem dist\glsmei-*.whl).FullName --force-reinstall
cd ..

Then the installation of glsmei is done.

3. Use the Application in Python
run

python main.py

API Reference

Installation from pip (If your Python and CUDA environment is supported): pip install glsmei
Verify installation: python -c "import lsmatching; print(lsmatching.__version__)"

Matching in CPU

Matching(left_image_path: str, right_image_path: str)
APIsParamsReturnsDescription
set_params(windowsize, d_corr_threshold)int=15, float=0.04Set template window size and correlation change threshold
set_matching_params(windowsize, corr_threshold)int=3, float=0.7Set initial matching parameters
set_centers(x1, y1, x2, y2)int × 4Set initial conjugate points on left/right images
calculate()Run single-point least-squares matching
get_left_window()np.ndarrayGet the left image matching window
get_right_window()np.ndarrayGet the right image matching window
get_matched_points(savepath)strExport matching results
get_matched_x()floatMatched point x-coordinate
get_matched_y()floatMatched point y-coordinate
get_delta0()floatStandard error of unit weight
get_deltag()floatStandard error of window
get_deltax()floatStandard error of parameters
get_SNR()floatSNR
get_h0() / get_h1()floatRadiometric distortion parameters
get_a0() / get_a1() / get_a2()floatAffine parameters (left → right, x-direction)
get_b0() / get_b1() / get_b2()floatAffine parameters (left → right, y-direction)
gpu_device_count()intNumber of available GPUs

Matching in GPU

batch_adjust_gpu(window_size=15, d_corr=0.04, max_iter=20, matching_wsize=3, corr_threshold=0.7, savepath=None)

GPU batch pipeline: Feature Extraction → Correlation Matching → Least-Squares Refinement

ParameterTypeDefaultDescription
window_sizeint15Least-squares refinement template window size
d_corrfloat0.04Correlation change threshold (convergence criterion)
max_iterint20Maximum iteration count
matching_wsizeint3Initial correlation matching template window size
corr_thresholdfloat0.7Initial matching correlation threshold
savepathstrNoneOutput save path

License

This project is licensed under the Apache License 2.0. See LICENSE details.

Citation

If you use our work or our data in your research, please cite:

@misc{Tang2026GLSMEI,
title = {G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs},
author = {Tang, Haojun and Zhou, Jiahao},
year = {2026},
howpublished = {\url{https://github.com/DonaldTrump-coder/G-LSMEI}},
note = {Version 1.0.2. Apache License 2.0}
}

About

A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The algorithm in C++, and a Python wrapper with GPU-acceleration is provided to expose it as a third-party library.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs

GitHub Repo starsGitHub Repo forksPyPI versionProject PageLicense: Apache 2.0Last CommitPlatform
A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The classic algorithm is proposed by Ackermann in DIGITAL IMAGE CORRELATION: PERFORMANCE AND POTENTIAL APPLICATION IN PHOTOGRAMMETRY (1984), where the correspondence search reduces to a one-dimensional problem along epipolar lines, enabling both fast convergence and high accuracy.

We provide the source code in C++ and a Python API library built upon it. A PyQt Demo Application and the CUDA-based GPU-accelerated version is also provided.
Up to now we have successfully tested the C++ and Python built from source code on Windows 10 and Windows 11.

Project Page
Contributors: Haojun Tang, Jiahao Zhou
Acknowledgements: Thanks to the guidance of Yunsheng Zhang from Central South University.

About the Project

Environment

Application Structure

CUDA Executions

Some Results

Matching Results

Left ImageRight Image

Time Costs

SetupsCPUGPU
Time (sec)332.270.621

Improved by 500+ times in our GPU implementation!

Core Algorithm tested in C++ (only CPU-based)

Prerequisites
MSVC (Visual Studio 2022, with C++ CMake tools), CMake ≥ 3.20, and the source code:

git clone https://github.com/DonaldTrump-coder/G-LSMEI --recursive

Build for the Code
In the project directory, run the following commands:

mkdir build
cd build
cmake .. -G "Visual Studio 17 2022"
cmake --build . --config Release
.\Release\leastsquares_matching.exe

The output is from the main function in core\src\test.cpp
Use the C++ source code for testing the algorithm.

Image Matching Application Deployment (CPU and GPU support)

Prerequisites
You also need MSVC and CMake, conda (or any Python environment), as well as nvcc for CUDA (Already successfully tested on CUDA 12.4). Install them and start to build!

1. Install the Requirement Packages for Python
In the project directory, run

conda create -n matching python=3.11
conda activate matching
pip install -r requirements.txt

2. Build the C++ and CUDA Source for Python Application

cd python
python setup.py bdist_wheel
python -m pip install (Get-ChildItem dist\glsmei-*.whl).FullName --force-reinstall
cd ..

Then the installation of glsmei is done.

3. Use the Application in Python
run

python main.py

API Reference

Installation from pip (If your Python and CUDA environment is supported): pip install glsmei
Verify installation: python -c "import lsmatching; print(lsmatching.__version__)"

Matching in CPU

Matching(left_image_path: str, right_image_path: str)
APIsParamsReturnsDescription
set_params(windowsize, d_corr_threshold)int=15, float=0.04Set template window size and correlation change threshold
set_matching_params(windowsize, corr_threshold)int=3, float=0.7Set initial matching parameters
set_centers(x1, y1, x2, y2)int × 4Set initial conjugate points on left/right images
calculate()Run single-point least-squares matching
get_left_window()np.ndarrayGet the left image matching window
get_right_window()np.ndarrayGet the right image matching window
get_matched_points(savepath)strExport matching results
get_matched_x()floatMatched point x-coordinate
get_matched_y()floatMatched point y-coordinate
get_delta0()floatStandard error of unit weight
get_deltag()floatStandard error of window
get_deltax()floatStandard error of parameters
get_SNR()floatSNR
get_h0() / get_h1()floatRadiometric distortion parameters
get_a0() / get_a1() / get_a2()floatAffine parameters (left → right, x-direction)
get_b0() / get_b1() / get_b2()floatAffine parameters (left → right, y-direction)
gpu_device_count()intNumber of available GPUs

Matching in GPU

batch_adjust_gpu(window_size=15, d_corr=0.04, max_iter=20, matching_wsize=3, corr_threshold=0.7, savepath=None)

GPU batch pipeline: Feature Extraction → Correlation Matching → Least-Squares Refinement

ParameterTypeDefaultDescription
window_sizeint15Least-squares refinement template window size
d_corrfloat0.04Correlation change threshold (convergence criterion)
max_iterint20Maximum iteration count
matching_wsizeint3Initial correlation matching template window size
corr_thresholdfloat0.7Initial matching correlation threshold
savepathstrNoneOutput save path

License

This project is licensed under the Apache License 2.0. See LICENSE details.

Citation

If you use our work or our data in your research, please cite:

@misc{Tang2026GLSMEI,
title = {G-LSMEI: GPU-Accelerated Least-Square Matching Refiner for Epipolar Image Pairs},
author = {Tang, Haojun and Zhou, Jiahao},
year = {2026},
howpublished = {\url{https://github.com/DonaldTrump-coder/G-LSMEI}},
note = {Version 1.0.2. Apache License 2.0}
}

About

A project of the sub-pixel Least-Square Matching Refining Algorithm for Epipolar-Rectified Stereo Image Pairs in window-size areas. The algorithm in C++, and a Python wrapper with GPU-acceleration is provided to expose it as a third-party library.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages