Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Zhang instructions for use:
---------------------------
0) Requirements:
- MATLAB (tested with R2010a) with Optimisation toolbox
- CALTag (https://github.com/brada/caltag)
1) Capture images:
You need about 15-20 images for a reasonable calibration. See http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html
for an example to the type of image set you need to capture. Bear the following in mind in order to maximise accuracy:
- use a tripod, or a fast shutterspeed
- calibration grid must be flat
- either keep the camera stationary and move the calibration grid, or keep
grid stationary and move the camera. Don't bump them! Use a remote
trigger on the camera if necessary
- try to explore the range of relative motion between the camera and the
grid as much as possible - tilt the grid and move it as far left/right,
up/down, near/far as you can (while still being able to accurately
detect the grid markers. CALTag should be able to handle angles of up to
about 60 degrees
2) Sample usage:
See the individual m-files for descriptions of the parameters
Calibration = zhang_init( 'IMG_*.jpg', 'mycalib.mat' );
Calibration = zhang_detectcorners( 'mycalib.mat', './data/CALTagPattern_14x9.mat' );
Calibration = zhang_calibrate_init( 'mycalib.mat', true, true, true, false );
Calibration = zhang_calibrate_optimise( Calibration, false, false, 100 );
% to run it again for another 100 iterations from the current point:
Calibration = zhang_calibrate_optimise( Calibration, false, true, 100 );
save( 'mycalib.mat', 'Calibration', '-append' );
zhang_plotpoints( Calibration, 1 );
Alternatively, to avoid writing to disk all the time (but remember to save
afterwards!) specify just "Calibration" instead of "'mycalib.mat'" as the
first argument to all the function calls after the first
3) Advanced use only:
If you want to impose additional nonlinear constrains on the calibration
parameters, then look at zhang_calibrate_optimise_nonlcon.m and
zhang_constraint_eq.m. These may be adapted to your particular setup. For
example, if you capture images with the camera moving along a translation
stage, then you may know the relative distance between viewpoints. The
example constraint shows how this would be implemented. Call the
optimise_nonlcon.m function after calibrate_optimise.m, but be aware that
it is slower, and not tested nearly as much.
4) Misc notes:
note that disabling/enabling images during calibration currently doesn't
work without manually resetting the parameter vector. If you just change
the Active property of a particular image, then the parameter vector
can no longer be properly unpacked because its length is incompatible
with the number of images. you must call Calibration.x =
zhang_paramvector(Calibration) after changing any active images. This
would be nicer in an object-oriented framework, but that would require
rearchitecting this entire thing... oh, and remember then to run the
optimisation from the current point, not the initial point (so set the
last flag to calibrate_optimise to true)
To create an OpenGL perspective projection matrix from the intrinsic
calibration matrrix, see:
http://www.hitlabnz.org/forum/showthread.php?604-argConvGLcpara2-camera-calibration-matrix-to-OpenGl-projection-matrixhttp://www.hitl.washington.edu/artoolkit/mail-archive/message-thread-00653-Re--Questions-concering-.html
and the function argConvGLcpara2 in ARToolkit
Basically it looks like:
[focal skew principle_x 0 ]
[ 0 aspect*f principle*y 0 ]
[ 0 0 1 0 ]
After multiplying a point in camera coordinates (X,Y,Z,1) by this matrix
you will get a point (X',Y',Z') and then dividing by the 3rd component will
give (X'',Y'') where you drop the 3rd (one) component.
Although the actual OpenGL matrix is a little different. See the source
code to argConvGLcpara2 for the results
5) Contact:
Questions/comments/bugfixes welcome.
Email me at: atcheson [NOSPAM] [at] cs [dot] ubc [dot] ca

About

Camera calibration using Zhang's algorithm and CALTag

Resources

Stars

44 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

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

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Zhang instructions for use:
---------------------------
0) Requirements:
- MATLAB (tested with R2010a) with Optimisation toolbox
- CALTag (https://github.com/brada/caltag)
1) Capture images:
You need about 15-20 images for a reasonable calibration. See http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html
for an example to the type of image set you need to capture. Bear the following in mind in order to maximise accuracy:
- use a tripod, or a fast shutterspeed
- calibration grid must be flat
- either keep the camera stationary and move the calibration grid, or keep
grid stationary and move the camera. Don't bump them! Use a remote
trigger on the camera if necessary
- try to explore the range of relative motion between the camera and the
grid as much as possible - tilt the grid and move it as far left/right,
up/down, near/far as you can (while still being able to accurately
detect the grid markers. CALTag should be able to handle angles of up to
about 60 degrees
2) Sample usage:
See the individual m-files for descriptions of the parameters
Calibration = zhang_init( 'IMG_*.jpg', 'mycalib.mat' );
Calibration = zhang_detectcorners( 'mycalib.mat', './data/CALTagPattern_14x9.mat' );
Calibration = zhang_calibrate_init( 'mycalib.mat', true, true, true, false );
Calibration = zhang_calibrate_optimise( Calibration, false, false, 100 );
% to run it again for another 100 iterations from the current point:
Calibration = zhang_calibrate_optimise( Calibration, false, true, 100 );
save( 'mycalib.mat', 'Calibration', '-append' );
zhang_plotpoints( Calibration, 1 );
Alternatively, to avoid writing to disk all the time (but remember to save
afterwards!) specify just "Calibration" instead of "'mycalib.mat'" as the
first argument to all the function calls after the first
3) Advanced use only:
If you want to impose additional nonlinear constrains on the calibration
parameters, then look at zhang_calibrate_optimise_nonlcon.m and
zhang_constraint_eq.m. These may be adapted to your particular setup. For
example, if you capture images with the camera moving along a translation
stage, then you may know the relative distance between viewpoints. The
example constraint shows how this would be implemented. Call the
optimise_nonlcon.m function after calibrate_optimise.m, but be aware that
it is slower, and not tested nearly as much.
4) Misc notes:
note that disabling/enabling images during calibration currently doesn't
work without manually resetting the parameter vector. If you just change
the Active property of a particular image, then the parameter vector
can no longer be properly unpacked because its length is incompatible
with the number of images. you must call Calibration.x =
zhang_paramvector(Calibration) after changing any active images. This
would be nicer in an object-oriented framework, but that would require
rearchitecting this entire thing... oh, and remember then to run the
optimisation from the current point, not the initial point (so set the
last flag to calibrate_optimise to true)
To create an OpenGL perspective projection matrix from the intrinsic
calibration matrrix, see:
http://www.hitlabnz.org/forum/showthread.php?604-argConvGLcpara2-camera-calibration-matrix-to-OpenGl-projection-matrixhttp://www.hitl.washington.edu/artoolkit/mail-archive/message-thread-00653-Re--Questions-concering-.html
and the function argConvGLcpara2 in ARToolkit
Basically it looks like:
[focal skew principle_x 0 ]
[ 0 aspect*f principle*y 0 ]
[ 0 0 1 0 ]
After multiplying a point in camera coordinates (X,Y,Z,1) by this matrix
you will get a point (X',Y',Z') and then dividing by the 3rd component will
give (X'',Y'') where you drop the 3rd (one) component.
Although the actual OpenGL matrix is a little different. See the source
code to argConvGLcpara2 for the results
5) Contact:
Questions/comments/bugfixes welcome.
Email me at: atcheson [NOSPAM] [at] cs [dot] ubc [dot] ca

About

Camera calibration using Zhang's algorithm and CALTag

Resources

Stars

44 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

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

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Zhang instructions for use:
---------------------------
0) Requirements:
- MATLAB (tested with R2010a) with Optimisation toolbox
- CALTag (https://github.com/brada/caltag)
1) Capture images:
You need about 15-20 images for a reasonable calibration. See http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html
for an example to the type of image set you need to capture. Bear the following in mind in order to maximise accuracy:
- use a tripod, or a fast shutterspeed
- calibration grid must be flat
- either keep the camera stationary and move the calibration grid, or keep
grid stationary and move the camera. Don't bump them! Use a remote
trigger on the camera if necessary
- try to explore the range of relative motion between the camera and the
grid as much as possible - tilt the grid and move it as far left/right,
up/down, near/far as you can (while still being able to accurately
detect the grid markers. CALTag should be able to handle angles of up to
about 60 degrees
2) Sample usage:
See the individual m-files for descriptions of the parameters
Calibration = zhang_init( 'IMG_*.jpg', 'mycalib.mat' );
Calibration = zhang_detectcorners( 'mycalib.mat', './data/CALTagPattern_14x9.mat' );
Calibration = zhang_calibrate_init( 'mycalib.mat', true, true, true, false );
Calibration = zhang_calibrate_optimise( Calibration, false, false, 100 );
% to run it again for another 100 iterations from the current point:
Calibration = zhang_calibrate_optimise( Calibration, false, true, 100 );
save( 'mycalib.mat', 'Calibration', '-append' );
zhang_plotpoints( Calibration, 1 );
Alternatively, to avoid writing to disk all the time (but remember to save
afterwards!) specify just "Calibration" instead of "'mycalib.mat'" as the
first argument to all the function calls after the first
3) Advanced use only:
If you want to impose additional nonlinear constrains on the calibration
parameters, then look at zhang_calibrate_optimise_nonlcon.m and
zhang_constraint_eq.m. These may be adapted to your particular setup. For
example, if you capture images with the camera moving along a translation
stage, then you may know the relative distance between viewpoints. The
example constraint shows how this would be implemented. Call the
optimise_nonlcon.m function after calibrate_optimise.m, but be aware that
it is slower, and not tested nearly as much.
4) Misc notes:
note that disabling/enabling images during calibration currently doesn't
work without manually resetting the parameter vector. If you just change
the Active property of a particular image, then the parameter vector
can no longer be properly unpacked because its length is incompatible
with the number of images. you must call Calibration.x =
zhang_paramvector(Calibration) after changing any active images. This
would be nicer in an object-oriented framework, but that would require
rearchitecting this entire thing... oh, and remember then to run the
optimisation from the current point, not the initial point (so set the
last flag to calibrate_optimise to true)
To create an OpenGL perspective projection matrix from the intrinsic
calibration matrrix, see:
http://www.hitlabnz.org/forum/showthread.php?604-argConvGLcpara2-camera-calibration-matrix-to-OpenGl-projection-matrixhttp://www.hitl.washington.edu/artoolkit/mail-archive/message-thread-00653-Re--Questions-concering-.html
and the function argConvGLcpara2 in ARToolkit
Basically it looks like:
[focal skew principle_x 0 ]
[ 0 aspect*f principle*y 0 ]
[ 0 0 1 0 ]
After multiplying a point in camera coordinates (X,Y,Z,1) by this matrix
you will get a point (X',Y',Z') and then dividing by the 3rd component will
give (X'',Y'') where you drop the 3rd (one) component.
Although the actual OpenGL matrix is a little different. See the source
code to argConvGLcpara2 for the results
5) Contact:
Questions/comments/bugfixes welcome.
Email me at: atcheson [NOSPAM] [at] cs [dot] ubc [dot] ca

About

Camera calibration using Zhang's algorithm and CALTag

Resources

Stars

44 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

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

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Zhang instructions for use:
---------------------------
0) Requirements:
- MATLAB (tested with R2010a) with Optimisation toolbox
- CALTag (https://github.com/brada/caltag)
1) Capture images:
You need about 15-20 images for a reasonable calibration. See http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html
for an example to the type of image set you need to capture. Bear the following in mind in order to maximise accuracy:
- use a tripod, or a fast shutterspeed
- calibration grid must be flat
- either keep the camera stationary and move the calibration grid, or keep
grid stationary and move the camera. Don't bump them! Use a remote
trigger on the camera if necessary
- try to explore the range of relative motion between the camera and the
grid as much as possible - tilt the grid and move it as far left/right,
up/down, near/far as you can (while still being able to accurately
detect the grid markers. CALTag should be able to handle angles of up to
about 60 degrees
2) Sample usage:
See the individual m-files for descriptions of the parameters
Calibration = zhang_init( 'IMG_*.jpg', 'mycalib.mat' );
Calibration = zhang_detectcorners( 'mycalib.mat', './data/CALTagPattern_14x9.mat' );
Calibration = zhang_calibrate_init( 'mycalib.mat', true, true, true, false );
Calibration = zhang_calibrate_optimise( Calibration, false, false, 100 );
% to run it again for another 100 iterations from the current point:
Calibration = zhang_calibrate_optimise( Calibration, false, true, 100 );
save( 'mycalib.mat', 'Calibration', '-append' );
zhang_plotpoints( Calibration, 1 );
Alternatively, to avoid writing to disk all the time (but remember to save
afterwards!) specify just "Calibration" instead of "'mycalib.mat'" as the
first argument to all the function calls after the first
3) Advanced use only:
If you want to impose additional nonlinear constrains on the calibration
parameters, then look at zhang_calibrate_optimise_nonlcon.m and
zhang_constraint_eq.m. These may be adapted to your particular setup. For
example, if you capture images with the camera moving along a translation
stage, then you may know the relative distance between viewpoints. The
example constraint shows how this would be implemented. Call the
optimise_nonlcon.m function after calibrate_optimise.m, but be aware that
it is slower, and not tested nearly as much.
4) Misc notes:
note that disabling/enabling images during calibration currently doesn't
work without manually resetting the parameter vector. If you just change
the Active property of a particular image, then the parameter vector
can no longer be properly unpacked because its length is incompatible
with the number of images. you must call Calibration.x =
zhang_paramvector(Calibration) after changing any active images. This
would be nicer in an object-oriented framework, but that would require
rearchitecting this entire thing... oh, and remember then to run the
optimisation from the current point, not the initial point (so set the
last flag to calibrate_optimise to true)
To create an OpenGL perspective projection matrix from the intrinsic
calibration matrrix, see:
http://www.hitlabnz.org/forum/showthread.php?604-argConvGLcpara2-camera-calibration-matrix-to-OpenGl-projection-matrixhttp://www.hitl.washington.edu/artoolkit/mail-archive/message-thread-00653-Re--Questions-concering-.html
and the function argConvGLcpara2 in ARToolkit
Basically it looks like:
[focal skew principle_x 0 ]
[ 0 aspect*f principle*y 0 ]
[ 0 0 1 0 ]
After multiplying a point in camera coordinates (X,Y,Z,1) by this matrix
you will get a point (X',Y',Z') and then dividing by the 3rd component will
give (X'',Y'') where you drop the 3rd (one) component.
Although the actual OpenGL matrix is a little different. See the source
code to argConvGLcpara2 for the results
5) Contact:
Questions/comments/bugfixes welcome.
Email me at: atcheson [NOSPAM] [at] cs [dot] ubc [dot] ca

About

Camera calibration using Zhang's algorithm and CALTag

Resources

Stars

44 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

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

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Zhang instructions for use:
---------------------------
0) Requirements:
- MATLAB (tested with R2010a) with Optimisation toolbox
- CALTag (https://github.com/brada/caltag)
1) Capture images:
You need about 15-20 images for a reasonable calibration. See http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html
for an example to the type of image set you need to capture. Bear the following in mind in order to maximise accuracy:
- use a tripod, or a fast shutterspeed
- calibration grid must be flat
- either keep the camera stationary and move the calibration grid, or keep
grid stationary and move the camera. Don't bump them! Use a remote
trigger on the camera if necessary
- try to explore the range of relative motion between the camera and the
grid as much as possible - tilt the grid and move it as far left/right,
up/down, near/far as you can (while still being able to accurately
detect the grid markers. CALTag should be able to handle angles of up to
about 60 degrees
2) Sample usage:
See the individual m-files for descriptions of the parameters
Calibration = zhang_init( 'IMG_*.jpg', 'mycalib.mat' );
Calibration = zhang_detectcorners( 'mycalib.mat', './data/CALTagPattern_14x9.mat' );
Calibration = zhang_calibrate_init( 'mycalib.mat', true, true, true, false );
Calibration = zhang_calibrate_optimise( Calibration, false, false, 100 );
% to run it again for another 100 iterations from the current point:
Calibration = zhang_calibrate_optimise( Calibration, false, true, 100 );
save( 'mycalib.mat', 'Calibration', '-append' );
zhang_plotpoints( Calibration, 1 );
Alternatively, to avoid writing to disk all the time (but remember to save
afterwards!) specify just "Calibration" instead of "'mycalib.mat'" as the
first argument to all the function calls after the first
3) Advanced use only:
If you want to impose additional nonlinear constrains on the calibration
parameters, then look at zhang_calibrate_optimise_nonlcon.m and
zhang_constraint_eq.m. These may be adapted to your particular setup. For
example, if you capture images with the camera moving along a translation
stage, then you may know the relative distance between viewpoints. The
example constraint shows how this would be implemented. Call the
optimise_nonlcon.m function after calibrate_optimise.m, but be aware that
it is slower, and not tested nearly as much.
4) Misc notes:
note that disabling/enabling images during calibration currently doesn't
work without manually resetting the parameter vector. If you just change
the Active property of a particular image, then the parameter vector
can no longer be properly unpacked because its length is incompatible
with the number of images. you must call Calibration.x =
zhang_paramvector(Calibration) after changing any active images. This
would be nicer in an object-oriented framework, but that would require
rearchitecting this entire thing... oh, and remember then to run the
optimisation from the current point, not the initial point (so set the
last flag to calibrate_optimise to true)
To create an OpenGL perspective projection matrix from the intrinsic
calibration matrrix, see:
http://www.hitlabnz.org/forum/showthread.php?604-argConvGLcpara2-camera-calibration-matrix-to-OpenGl-projection-matrixhttp://www.hitl.washington.edu/artoolkit/mail-archive/message-thread-00653-Re--Questions-concering-.html
and the function argConvGLcpara2 in ARToolkit
Basically it looks like:
[focal skew principle_x 0 ]
[ 0 aspect*f principle*y 0 ]
[ 0 0 1 0 ]
After multiplying a point in camera coordinates (X,Y,Z,1) by this matrix
you will get a point (X',Y',Z') and then dividing by the 3rd component will
give (X'',Y'') where you drop the 3rd (one) component.
Although the actual OpenGL matrix is a little different. See the source
code to argConvGLcpara2 for the results
5) Contact:
Questions/comments/bugfixes welcome.
Email me at: atcheson [NOSPAM] [at] cs [dot] ubc [dot] ca

About

Camera calibration using Zhang's algorithm and CALTag

Resources

Stars

44 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

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

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Zhang instructions for use:
---------------------------
0) Requirements:
- MATLAB (tested with R2010a) with Optimisation toolbox
- CALTag (https://github.com/brada/caltag)
1) Capture images:
You need about 15-20 images for a reasonable calibration. See http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html
for an example to the type of image set you need to capture. Bear the following in mind in order to maximise accuracy:
- use a tripod, or a fast shutterspeed
- calibration grid must be flat
- either keep the camera stationary and move the calibration grid, or keep
grid stationary and move the camera. Don't bump them! Use a remote
trigger on the camera if necessary
- try to explore the range of relative motion between the camera and the
grid as much as possible - tilt the grid and move it as far left/right,
up/down, near/far as you can (while still being able to accurately
detect the grid markers. CALTag should be able to handle angles of up to
about 60 degrees
2) Sample usage:
See the individual m-files for descriptions of the parameters
Calibration = zhang_init( 'IMG_*.jpg', 'mycalib.mat' );
Calibration = zhang_detectcorners( 'mycalib.mat', './data/CALTagPattern_14x9.mat' );
Calibration = zhang_calibrate_init( 'mycalib.mat', true, true, true, false );
Calibration = zhang_calibrate_optimise( Calibration, false, false, 100 );
% to run it again for another 100 iterations from the current point:
Calibration = zhang_calibrate_optimise( Calibration, false, true, 100 );
save( 'mycalib.mat', 'Calibration', '-append' );
zhang_plotpoints( Calibration, 1 );
Alternatively, to avoid writing to disk all the time (but remember to save
afterwards!) specify just "Calibration" instead of "'mycalib.mat'" as the
first argument to all the function calls after the first
3) Advanced use only:
If you want to impose additional nonlinear constrains on the calibration
parameters, then look at zhang_calibrate_optimise_nonlcon.m and
zhang_constraint_eq.m. These may be adapted to your particular setup. For
example, if you capture images with the camera moving along a translation
stage, then you may know the relative distance between viewpoints. The
example constraint shows how this would be implemented. Call the
optimise_nonlcon.m function after calibrate_optimise.m, but be aware that
it is slower, and not tested nearly as much.
4) Misc notes:
note that disabling/enabling images during calibration currently doesn't
work without manually resetting the parameter vector. If you just change
the Active property of a particular image, then the parameter vector
can no longer be properly unpacked because its length is incompatible
with the number of images. you must call Calibration.x =
zhang_paramvector(Calibration) after changing any active images. This
would be nicer in an object-oriented framework, but that would require
rearchitecting this entire thing... oh, and remember then to run the
optimisation from the current point, not the initial point (so set the
last flag to calibrate_optimise to true)
To create an OpenGL perspective projection matrix from the intrinsic
calibration matrrix, see:
http://www.hitlabnz.org/forum/showthread.php?604-argConvGLcpara2-camera-calibration-matrix-to-OpenGl-projection-matrixhttp://www.hitl.washington.edu/artoolkit/mail-archive/message-thread-00653-Re--Questions-concering-.html
and the function argConvGLcpara2 in ARToolkit
Basically it looks like:
[focal skew principle_x 0 ]
[ 0 aspect*f principle*y 0 ]
[ 0 0 1 0 ]
After multiplying a point in camera coordinates (X,Y,Z,1) by this matrix
you will get a point (X',Y',Z') and then dividing by the 3rd component will
give (X'',Y'') where you drop the 3rd (one) component.
Although the actual OpenGL matrix is a little different. See the source
code to argConvGLcpara2 for the results
5) Contact:
Questions/comments/bugfixes welcome.
Email me at: atcheson [NOSPAM] [at] cs [dot] ubc [dot] ca

About

Camera calibration using Zhang's algorithm and CALTag

Resources

Stars

44 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

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

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Zhang instructions for use:
---------------------------
0) Requirements:
- MATLAB (tested with R2010a) with Optimisation toolbox
- CALTag (https://github.com/brada/caltag)
1) Capture images:
You need about 15-20 images for a reasonable calibration. See http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html
for an example to the type of image set you need to capture. Bear the following in mind in order to maximise accuracy:
- use a tripod, or a fast shutterspeed
- calibration grid must be flat
- either keep the camera stationary and move the calibration grid, or keep
grid stationary and move the camera. Don't bump them! Use a remote
trigger on the camera if necessary
- try to explore the range of relative motion between the camera and the
grid as much as possible - tilt the grid and move it as far left/right,
up/down, near/far as you can (while still being able to accurately
detect the grid markers. CALTag should be able to handle angles of up to
about 60 degrees
2) Sample usage:
See the individual m-files for descriptions of the parameters
Calibration = zhang_init( 'IMG_*.jpg', 'mycalib.mat' );
Calibration = zhang_detectcorners( 'mycalib.mat', './data/CALTagPattern_14x9.mat' );
Calibration = zhang_calibrate_init( 'mycalib.mat', true, true, true, false );
Calibration = zhang_calibrate_optimise( Calibration, false, false, 100 );
% to run it again for another 100 iterations from the current point:
Calibration = zhang_calibrate_optimise( Calibration, false, true, 100 );
save( 'mycalib.mat', 'Calibration', '-append' );
zhang_plotpoints( Calibration, 1 );
Alternatively, to avoid writing to disk all the time (but remember to save
afterwards!) specify just "Calibration" instead of "'mycalib.mat'" as the
first argument to all the function calls after the first
3) Advanced use only:
If you want to impose additional nonlinear constrains on the calibration
parameters, then look at zhang_calibrate_optimise_nonlcon.m and
zhang_constraint_eq.m. These may be adapted to your particular setup. For
example, if you capture images with the camera moving along a translation
stage, then you may know the relative distance between viewpoints. The
example constraint shows how this would be implemented. Call the
optimise_nonlcon.m function after calibrate_optimise.m, but be aware that
it is slower, and not tested nearly as much.
4) Misc notes:
note that disabling/enabling images during calibration currently doesn't
work without manually resetting the parameter vector. If you just change
the Active property of a particular image, then the parameter vector
can no longer be properly unpacked because its length is incompatible
with the number of images. you must call Calibration.x =
zhang_paramvector(Calibration) after changing any active images. This
would be nicer in an object-oriented framework, but that would require
rearchitecting this entire thing... oh, and remember then to run the
optimisation from the current point, not the initial point (so set the
last flag to calibrate_optimise to true)
To create an OpenGL perspective projection matrix from the intrinsic
calibration matrrix, see:
http://www.hitlabnz.org/forum/showthread.php?604-argConvGLcpara2-camera-calibration-matrix-to-OpenGl-projection-matrixhttp://www.hitl.washington.edu/artoolkit/mail-archive/message-thread-00653-Re--Questions-concering-.html
and the function argConvGLcpara2 in ARToolkit
Basically it looks like:
[focal skew principle_x 0 ]
[ 0 aspect*f principle*y 0 ]
[ 0 0 1 0 ]
After multiplying a point in camera coordinates (X,Y,Z,1) by this matrix
you will get a point (X',Y',Z') and then dividing by the 3rd component will
give (X'',Y'') where you drop the 3rd (one) component.
Although the actual OpenGL matrix is a little different. See the source
code to argConvGLcpara2 for the results
5) Contact:
Questions/comments/bugfixes welcome.
Email me at: atcheson [NOSPAM] [at] cs [dot] ubc [dot] ca

About

Camera calibration using Zhang's algorithm and CALTag

Resources

Stars

44 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

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

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Zhang instructions for use:
---------------------------
0) Requirements:
- MATLAB (tested with R2010a) with Optimisation toolbox
- CALTag (https://github.com/brada/caltag)
1) Capture images:
You need about 15-20 images for a reasonable calibration. See http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html
for an example to the type of image set you need to capture. Bear the following in mind in order to maximise accuracy:
- use a tripod, or a fast shutterspeed
- calibration grid must be flat
- either keep the camera stationary and move the calibration grid, or keep
grid stationary and move the camera. Don't bump them! Use a remote
trigger on the camera if necessary
- try to explore the range of relative motion between the camera and the
grid as much as possible - tilt the grid and move it as far left/right,
up/down, near/far as you can (while still being able to accurately
detect the grid markers. CALTag should be able to handle angles of up to
about 60 degrees
2) Sample usage:
See the individual m-files for descriptions of the parameters
Calibration = zhang_init( 'IMG_*.jpg', 'mycalib.mat' );
Calibration = zhang_detectcorners( 'mycalib.mat', './data/CALTagPattern_14x9.mat' );
Calibration = zhang_calibrate_init( 'mycalib.mat', true, true, true, false );
Calibration = zhang_calibrate_optimise( Calibration, false, false, 100 );
% to run it again for another 100 iterations from the current point:
Calibration = zhang_calibrate_optimise( Calibration, false, true, 100 );
save( 'mycalib.mat', 'Calibration', '-append' );
zhang_plotpoints( Calibration, 1 );
Alternatively, to avoid writing to disk all the time (but remember to save
afterwards!) specify just "Calibration" instead of "'mycalib.mat'" as the
first argument to all the function calls after the first
3) Advanced use only:
If you want to impose additional nonlinear constrains on the calibration
parameters, then look at zhang_calibrate_optimise_nonlcon.m and
zhang_constraint_eq.m. These may be adapted to your particular setup. For
example, if you capture images with the camera moving along a translation
stage, then you may know the relative distance between viewpoints. The
example constraint shows how this would be implemented. Call the
optimise_nonlcon.m function after calibrate_optimise.m, but be aware that
it is slower, and not tested nearly as much.
4) Misc notes:
note that disabling/enabling images during calibration currently doesn't
work without manually resetting the parameter vector. If you just change
the Active property of a particular image, then the parameter vector
can no longer be properly unpacked because its length is incompatible
with the number of images. you must call Calibration.x =
zhang_paramvector(Calibration) after changing any active images. This
would be nicer in an object-oriented framework, but that would require
rearchitecting this entire thing... oh, and remember then to run the
optimisation from the current point, not the initial point (so set the
last flag to calibrate_optimise to true)
To create an OpenGL perspective projection matrix from the intrinsic
calibration matrrix, see:
http://www.hitlabnz.org/forum/showthread.php?604-argConvGLcpara2-camera-calibration-matrix-to-OpenGl-projection-matrixhttp://www.hitl.washington.edu/artoolkit/mail-archive/message-thread-00653-Re--Questions-concering-.html
and the function argConvGLcpara2 in ARToolkit
Basically it looks like:
[focal skew principle_x 0 ]
[ 0 aspect*f principle*y 0 ]
[ 0 0 1 0 ]
After multiplying a point in camera coordinates (X,Y,Z,1) by this matrix
you will get a point (X',Y',Z') and then dividing by the 3rd component will
give (X'',Y'') where you drop the 3rd (one) component.
Although the actual OpenGL matrix is a little different. See the source
code to argConvGLcpara2 for the results
5) Contact:
Questions/comments/bugfixes welcome.
Email me at: atcheson [NOSPAM] [at] cs [dot] ubc [dot] ca

About

Camera calibration using Zhang's algorithm and CALTag

Resources

Stars

44 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages