﻿<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=%E5%88%A9%E7%94%A8%E8%80%85%3ASftrabbit%2FGSoC_2013%2FDocumentation%2FTechnical_Overview</id>
	<title>利用者:Sftrabbit/GSoC 2013/Documentation/Technical Overview - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=%E5%88%A9%E7%94%A8%E8%80%85%3ASftrabbit%2FGSoC_2013%2FDocumentation%2FTechnical_Overview"/>
	<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sftrabbit/GSoC_2013/Documentation/Technical_Overview&amp;action=history"/>
	<updated>2026-05-19T18:59:33Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sftrabbit/GSoC_2013/Documentation/Technical_Overview&amp;diff=143727&amp;oldid=prev</id>
		<title>Yamyam: 1版 をインポートしました</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sftrabbit/GSoC_2013/Documentation/Technical_Overview&amp;diff=143727&amp;oldid=prev"/>
		<updated>2018-06-28T21:04:26Z</updated>

		<summary type="html">&lt;p&gt;1版 をインポートしました&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;2018年6月28日 (木) 21:04時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ja&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(相違点なし)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Yamyam</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sftrabbit/GSoC_2013/Documentation/Technical_Overview&amp;diff=143726&amp;oldid=prev</id>
		<title>wiki&gt;Sftrabbit: /* Tracks storage */</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sftrabbit/GSoC_2013/Documentation/Technical_Overview&amp;diff=143726&amp;oldid=prev"/>
		<updated>2013-09-23T20:20:49Z</updated>

		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Tracks storage&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Technical Overview=&lt;br /&gt;
&lt;br /&gt;
==Focal length constraints==&lt;br /&gt;
&lt;br /&gt;
===DNA===&lt;br /&gt;
&lt;br /&gt;
The relevant DNA types are found in &amp;lt;code&amp;gt;source/blender/makesdna/DNA_tracking_types.h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;MovieTrackingSettings&amp;lt;/code&amp;gt; DNA struct contains the following relevant properties:&lt;br /&gt;
* &amp;lt;code&amp;gt;refine_intrinsics&amp;lt;/code&amp;gt; - bit flags identifying intrinsics to refine. Some combination of &amp;lt;code&amp;gt;REFINE_FOCAL_LENGTH&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REFINE_PRINCIPAL_POINT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REFINE_RADIAL_DISTORTION_K1&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;REFINE_RADIAL_DISTORTION_K2&amp;lt;/code&amp;gt;. Only some combinations are currently supported.&lt;br /&gt;
* &amp;lt;code&amp;gt;constrain_intrinsics&amp;lt;/code&amp;gt; - bit flags identifying which intrinsics to refine. Currently, the only valid flag is &amp;lt;code&amp;gt;CONSTRAIN_FOCAL_LENGTH&amp;lt;/code&amp;gt;. This could potentially expand in the future.&lt;br /&gt;
* &amp;lt;code&amp;gt;focal_length_{min/max}&amp;lt;/code&amp;gt; - these are the values that define the constraint range. They are stored in pixel units.&lt;br /&gt;
&lt;br /&gt;
===RNA===&lt;br /&gt;
&lt;br /&gt;
The relevant RNA structs are found in &amp;lt;code&amp;gt;source/blender/makesrna/intern/rna_tracking.c&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following properties have been modified or added:&lt;br /&gt;
* &amp;lt;code&amp;gt;refine_intrinsics&amp;lt;/code&amp;gt; - corresponds directly to the &amp;lt;code&amp;gt;refine_intrinsics&amp;lt;/code&amp;gt; in DNA&lt;br /&gt;
* &amp;lt;code&amp;gt;use_focal_length_constraint&amp;lt;/code&amp;gt; - a boolean property that sets the &amp;lt;code&amp;gt;CONSTRAIN_FOCAL_LENGTH&amp;lt;/code&amp;gt; flag in DNA.&lt;br /&gt;
* &amp;lt;code&amp;gt;focal_length_{min/max}_pixels&amp;lt;/code&amp;gt; - corresponds to &amp;lt;code&amp;gt;focal_length_{min/max}&amp;lt;/code&amp;gt; in DNA. The minimum must always be less than the maximum (see &amp;lt;code&amp;gt;rna_trackingSettings_focal_length_{min/max}_pixels_set&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;focal_length_{min/max}&amp;lt;/code&amp;gt; - used for setting the focal length in millimeters. The conversion to and from pixels is performed by &amp;lt;code&amp;gt;rna_trackingSettings_focal_length_{min/max}_set&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;rna_trackingSettings_focal_length_{min/max}_get&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
&lt;br /&gt;
The user interface is implemented in &amp;lt;code&amp;gt;release/scripts/startup/bl_ui/space_clip.py&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The constraints fields of the {{Literal|Solve}} panel are enabled when any option from the {{Literal|Refine}} select box containing &amp;quot;Focal Length&amp;quot; is chosen. This is determined by checking if &amp;lt;code&amp;gt;&amp;quot;FOCAL_LENGTH&amp;quot;&amp;lt;/code&amp;gt; is a substring of the value of &amp;lt;code&amp;gt;settings.refine_intrinsics&amp;lt;/code&amp;gt;. The minimum and maximum fields are then only enabled when &amp;lt;code&amp;gt;settings.use_focal_length_constraint&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;tracking.camera.units&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;'MILLIMETERS'&amp;lt;/code&amp;gt; (in the {{Literal|Camera Data}} panel), the minimum and maximum fields correspond to the &amp;lt;code&amp;gt;focal_length_{min/max}&amp;lt;/code&amp;gt; RNA properties. Otherwise, they correspond to the &amp;lt;code&amp;gt;focal_length_{min/max}_pixels&amp;lt;/code&amp;gt; RNA properties.&lt;br /&gt;
&lt;br /&gt;
[[File:focal-length-constraint.png|none|frame|Applying a focal length constraint.]]&lt;br /&gt;
&lt;br /&gt;
===Kernel===&lt;br /&gt;
&lt;br /&gt;
A number of changes have been made to &amp;lt;code&amp;gt;source/blender/blenkernel/intern/tracking.c&amp;lt;/code&amp;gt;. First of all, the function &amp;lt;code&amp;gt;BKE_tracking_camera_focal_length_set&amp;lt;/code&amp;gt; has been added to ensure that the constraint values update to match the given focal length when the constraint is disabled&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;reconstruct_refine_intrinsics_get_flags&amp;lt;/code&amp;gt; function converts from the DNA properties to &amp;lt;code&amp;gt;MovieReconstructContext&amp;lt;/code&amp;gt; properties, which are similar their DNA counterparts but take values from the libmv API (see below).&lt;br /&gt;
&lt;br /&gt;
When the reconstruction job begins, &amp;lt;code&amp;gt;BKE_tracking_reconstruction_solve&amp;lt;/code&amp;gt; calls both &amp;lt;code&amp;gt;cameraIntrinsicsOptionsFromContext&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reconstructionOptionsFromContext&amp;lt;/code&amp;gt; to convert these context properties to the appropriate libmv options structs. The former applies the &amp;lt;code&amp;gt;CLAMP&amp;lt;/code&amp;gt; macro to the focal length to ensure it is not outside the constraint boundaries.&lt;br /&gt;
&lt;br /&gt;
===Libmv API===&lt;br /&gt;
&lt;br /&gt;
Constraint data is passed to libmv in a &amp;lt;code&amp;gt;libmv_ReconstructionOptions&amp;lt;/code&amp;gt; object. This struct is defined in &amp;lt;code&amp;gt;extern/libmv/libmv-capi.h&amp;lt;/code&amp;gt;. It now has the following properties that currently mimic the DNA properties (but there is no need for them to be identical):&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;refine_intrinsics&amp;lt;/code&amp;gt; - some combination of &amp;lt;code&amp;gt;LIBMV_REFINE_FOCAL_LENGTH&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LIBMV_REFINE_PRINCIPAL_POINT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LIBMV_REFINE_RADIAL_DISTORTION_K1&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;LIBMV_REFINE_RADIAL_DISTORTION_K2&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;constrain_intrinsics&amp;lt;/code&amp;gt; - currently the only accepted value is &amp;lt;code&amp;gt;LIBMV_CONSTRAIN_FOCAL_LENGTH&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;focal_length_{min/max}&amp;lt;/code&amp;gt; - constraint values.&lt;br /&gt;
&lt;br /&gt;
===Libmv internals===&lt;br /&gt;
&lt;br /&gt;
The constraint properties primarily affect bundle adjustment. Previously, only a single option was passed to the bundle adjustment algorithm as an argument. Now that this has grown, a &amp;lt;code&amp;gt;BundleOptions&amp;lt;/code&amp;gt; class type has been introduced in &amp;lt;code&amp;gt;extern/libmv/libmv/simple_pipeline/bundle.h&amp;lt;/code&amp;gt;. These options do not all take the same form as the properties passed into libmv, however:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;bundle_intrinsics&amp;lt;/code&amp;gt; - flags specifying which intrinsics to include in bundle adjustment. See the &amp;lt;code&amp;gt;BundleIntrinsics&amp;lt;/code&amp;gt; enum for a list of flags.&lt;br /&gt;
* &amp;lt;code&amp;gt;constraints&amp;lt;/code&amp;gt; - flags specifying abstract constraints to apply during bundle adjustment. Unlike previous properties, these constraints may not refer to a particular intrinsic. Currently, the accepted values are &amp;lt;code&amp;gt;BUNDLE_NO_CONSTRAINTS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BUNDLE_NO_TRANSLATION&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BUNDLE_CONSTRAIN_FOCAL_LENGTH&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;focal_length_{min,max}&amp;lt;/code&amp;gt; - as before, these are the constraint values to apply to the focal length under adjustment.&lt;br /&gt;
&lt;br /&gt;
Libmv uses Ceres Solver for bundle adjustment by minimizing the reprojection error. Ceres is an unconstrained minimizer, however, so it will adjust the function parameters without bounds. To apply a bound to the focal length, the &amp;lt;code&amp;gt;ConstrainFocalLength&amp;lt;/code&amp;gt; function applies a transformation to the focal length parameter (if the appropriate options have been set). This transformation is simply &amp;lt;code&amp;gt;arcsin&amp;lt;/code&amp;gt; scaled and translated such that the upper and lower limit of its result are the constraint bounds. The transformed variable will be unconstrained when minimised, but will always give a focal length within the bounds when transformed back using &amp;lt;code&amp;gt;UnconstrainFocalLength&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 constrain(f, min, max) = arcsin(-1 + ((f - min) / (max - min)) * 2)&lt;br /&gt;
 unconstrain(f, min, max) = min + (max - min) * (1 + sin(f)) / 2&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==Multicamera reconstruction==&lt;br /&gt;
&lt;br /&gt;
===Libmv API===&lt;br /&gt;
&lt;br /&gt;
The libmv API for multicamera reconstruction is almost identical to as it was before. One small change is that the camera intrinsics argument to &amp;lt;code&amp;gt;libmv_solve&amp;lt;/code&amp;gt; is an array, where each set of intrinsics applies to a single camera. However, since array type arguments in C are transformed to pointer types, this is merely a semantic difference. Instead of passing a pointer to a single &amp;lt;code&amp;gt;libmv_CameraIntrinsicsOptions&amp;lt;/code&amp;gt; object, the client passes a pointer to the first element of an array of &amp;lt;code&amp;gt;libmv_CameraIntrinsicsOptions&amp;lt;/code&amp;gt; objects. The elements each correspond to a different camera.&lt;br /&gt;
&lt;br /&gt;
===Tracks storage===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Tracks&amp;lt;/code&amp;gt; class stores &amp;lt;code&amp;gt;Markers&amp;lt;/code&amp;gt; which correspond to points in the images that libmv uses to reconstruct the scene. &amp;lt;code&amp;gt;Markers&amp;lt;/code&amp;gt;, prior to my changes, had two important members: &amp;lt;code&amp;gt;track&amp;lt;/code&amp;gt;, which identifies the track that the marker belongs to; and &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt;, which identifies the image that the marker corresponds to. To accommodate multicamera reconstruction, a marker also needs to be associated with a particular camera.&lt;br /&gt;
&lt;br /&gt;
My first approach was to have a &amp;lt;code&amp;gt;camera&amp;lt;/code&amp;gt; member to identify a camera, and then the &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt; member would identify which frame of the camera that marker is associated with. So two markers could have the same &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt; but could actually be associated with different frames from different &amp;lt;code&amp;gt;camera&amp;lt;/code&amp;gt;s. This, however, meant many changes to the way the libmv algorithms worked. It also interprets the &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt; identifier as &amp;quot;frame&amp;quot;, although libmv doesn't actually concern itself with the order of images in a video.&lt;br /&gt;
&lt;br /&gt;
Instead, I took a different approach, in which the &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt; identifier is unique for all frames from all cameras. That is, the first frame of one camera and the first frame of another would have different &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt; identifiers. A new &amp;lt;code&amp;gt;camera&amp;lt;/code identifier would then be used to annotate the markers to associate them with a particular camera. All markers with a specific &amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt; identifier should also have the same &amp;lt;code&amp;gt;camera&amp;lt;/code&amp;gt; identifier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Marker {&lt;br /&gt;
  int image;&lt;br /&gt;
  int track;&lt;br /&gt;
  double x, y;&lt;br /&gt;
  int camera;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This works well because libmv only needs to keep track of which cameras the markers belong to. This information isn't actually used in reconstruction. The algorithms only need to receive a bunch of markers from images - they don't even need to be from frames of a video. When reconstruction is complete, libmv can use these camera identifiers to pass the reconstructed camera orientations back to the client.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Tracks&amp;lt;/code&amp;gt; class has a number of member functions that provide access to &amp;lt;code&amp;gt;Marker&amp;lt;/code&amp;gt;s based on their associated &amp;lt;code&amp;gt;camera&amp;lt;/code&amp;gt;. For example, &amp;lt;code&amp;gt;MarkersForCamera&amp;lt;/code&amp;gt; will return all the markers associated with a particular camera.&lt;br /&gt;
&lt;br /&gt;
===Reconstruction storage===&lt;br /&gt;
&lt;br /&gt;
Similarly, the reconstructed camera positions/orientations have associated physical cameras. That is, the &amp;lt;code&amp;gt;EuclideanView&amp;lt;/code&amp;gt; reconstructed from markers with a specific &amp;lt;code&amp;gt;camera&amp;lt;/code&amp;gt; identifier will have the same &amp;lt;code&amp;gt;camera&amp;lt;/code&amp;gt; identifier. This allows the client the understand which of the reconstructed views correspond to which cameras and frames. &amp;lt;code&amp;gt;AllViewsForCamera&amp;lt;/code&amp;gt; can be used to get all views reconstructed for a particular camera.&lt;br /&gt;
&lt;br /&gt;
===Libmv internals===&lt;br /&gt;
&lt;br /&gt;
All of the internal algorithms needed to be updated to be multicamera-aware. For those algorithms that rely on having images from a single camera (such as the two frame reconstruction initialization), this simply meant extracting tracks for the first camera and using only those.&lt;br /&gt;
&lt;br /&gt;
For bundle adjustment, the multiple sets of camera intrinsics passes into libmv need to be used for calculating the reprojection error for each marker. This works by adding the appropriate intrinsics to the parameters of each marker's cost function according to its &amp;lt;code&amp;gt;camera&amp;lt;/code&amp;gt; identifier:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
problem.AddResidualBlock(new ceres::AutoDiffCostFunction&amp;lt;&lt;br /&gt;
    OpenCVReprojectionError, 2, 8, 6, 3&amp;gt;(cost_function),&lt;br /&gt;
    NULL,&lt;br /&gt;
    &amp;amp;ceres_intrinsics[camera](0),&lt;br /&gt;
    current_view_R_t,&lt;br /&gt;
    &amp;amp;point-&amp;gt;X(0));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;OpenCVReprojectionError&amp;lt;/code&amp;gt; cost functor then uses these intrinsics to compute the reprojection error for each marker.&lt;br /&gt;
&lt;br /&gt;
Whenever an algorithm produces a reconstructed camera view, it adds it to the &amp;lt;code&amp;gt;EuclideanReconstruction&amp;lt;/code&amp;gt; object and associates it with the appropriate camera.&lt;br /&gt;
&lt;br /&gt;
===Terminology===&lt;br /&gt;
&lt;br /&gt;
The following terminology was decided on to avoid confusing clashes of names:&lt;br /&gt;
&lt;br /&gt;
* View - a specific instance of a camera at some orientation and point in space (giving an image of the scene)&lt;br /&gt;
* Multiview reconstruction - reconstruction of a scene from multiple views&lt;br /&gt;
* Camera - a physical video camera&lt;br /&gt;
* Multicamera reconstruction - a form of multiview reconstruction, where the views are associated with some number of video cameras&lt;br /&gt;
&lt;br /&gt;
Previously, views were known as cameras, which meant that a &amp;lt;code&amp;gt;EuclideanReconstruction&amp;lt;/code&amp;gt; contained &amp;lt;code&amp;gt;EuclideanCamera&amp;lt;/code&amp;gt;s which were each associated with a particular physical video camera. Now, a &amp;lt;code&amp;gt;EuclideanReconstruction&amp;lt;/code&amp;gt; contains &amp;lt;code&amp;gt;EuclideanView&amp;lt;/code&amp;gt;s instead.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==Code clean-up==&lt;br /&gt;
&lt;br /&gt;
===Unified libmv API===&lt;br /&gt;
&lt;br /&gt;
While studying the libmv source, I noticed that &amp;lt;code&amp;gt;libmv_solveReconstruction&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;libmv_solveModal&amp;lt;/code&amp;gt; had a lot of code in common. They were each part of the libmv C API and would be called based on whether the client code wanted to perform a modal solve or not. I thought a better approach would be to have a single libmv_solve function that will use the modal solver when a certain option is passed.&lt;br /&gt;
&lt;br /&gt;
To this end, &amp;lt;code&amp;gt;libmv_ReconstructionOptions&amp;lt;/code&amp;gt; now has a &amp;lt;code&amp;gt;motion_flag&amp;lt;/code&amp;gt; option that may have the &amp;lt;code&amp;gt;LIBMV_TRACKING_MOTION_MODAL&amp;lt;/code&amp;gt; flag set. If it is set, the modal solver will be used. Otherwise, normal reconstruction will take place.&lt;br /&gt;
&lt;br /&gt;
This cleans up the libmv interface by moving the decision of whether to perform a modal solve or not into libmv and also makes clear the steps that are common between both solvers.&lt;br /&gt;
&lt;br /&gt;
===C/C++ interface consistency===&lt;br /&gt;
&lt;br /&gt;
I also noticed that these was a lot of inconsistency between naming conventions within the libmv C API. This is probably caused by the fact that it's an interface between C and C++, which each have their own code styles, and there's no real guideline for this situation. To fix this, the following rules were made:&lt;br /&gt;
&lt;br /&gt;
* All identifiers exposed by the API begin with the library name followed by an underscore. In this case, &amp;lt;code&amp;gt;libmv_&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Types are in camel-case and begin with a capital letter. For example, &amp;lt;code&amp;gt;libmv_CameraIntrinsicsOptions&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Functions are in camel-case and begin with a lower-case letter. For example, &amp;lt;code&amp;gt;libmv_cameraIntrinsicsInvert&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Types that are exposed by the API should be typedefed '''unless''' only a declaration is provided in the API. That is, if the definition of the type is hidden within the library, the type should not be typedefed.&lt;/div&gt;</summary>
		<author><name>wiki&gt;Sftrabbit</name></author>
		
	</entry>
</feed>