<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OCR Archives - Truiton</title>
	<atom:link href="https://www.truiton.com/tag/ocr/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Technology Reaching Us In Time - Online</description>
	<lastBuildDate>Sun, 01 Sep 2019 09:55:27 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://i0.wp.com/www.truiton.com/wp-content/uploads/2022/11/cropped-truiton_new_logo_half_white.png?fit=32%2C32&#038;ssl=1</url>
	<title>OCR Archives - Truiton</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">54534495</site>	<item>
		<title>Introducing Android Mobile Vision API</title>
		<link>https://www.truiton.com/2017/05/introducing-android-mobile-vision-api/</link>
					<comments>https://www.truiton.com/2017/05/introducing-android-mobile-vision-api/#comments</comments>
		
		<dc:creator><![CDATA[Mohit Gupt]]></dc:creator>
		<pubDate>Sun, 28 May 2017 17:29:27 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Face Detection]]></category>
		<category><![CDATA[Image Recognition]]></category>
		<category><![CDATA[Mobile Vision API]]></category>
		<category><![CDATA[OCR]]></category>
		<guid isPermaLink="false">http://www.truiton.com/?p=1557</guid>

					<description><![CDATA[<p>In August 2015, Google announced the release of Android Mobile Vision API. At that time this API had mainly three&#160;components Face Detection, Barcode scanner and ways to capture the tracking of objects in real time. But later on some bugs were found in its implementation, due to which the access to this API was restricted&#8230;&#160;<a href="https://www.truiton.com/2017/05/introducing-android-mobile-vision-api/" rel="bookmark">Read More &#187;<span class="screen-reader-text">Introducing Android Mobile Vision API</span></a></p>
<p>The post <a href="https://www.truiton.com/2017/05/introducing-android-mobile-vision-api/">Introducing Android Mobile Vision API</a> appeared first on <a href="https://www.truiton.com">Truiton</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="aligncenter"><img data-recalc-dims="1" fetchpriority="high" decoding="async" width="950" height="530" data-attachment-id="1741" data-permalink="https://www.truiton.com/2017/05/introducing-android-mobile-vision-api/android-mobile-vision-featured/" data-orig-file="https://i0.wp.com/www.truiton.com/wp-content/uploads/2017/05/Android-Mobile-Vision-Featured.jpg?fit=950%2C530&amp;ssl=1" data-orig-size="950,530" data-comments-opened="1" data-image-title="Android Mobile Vision Featured" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/www.truiton.com/wp-content/uploads/2017/05/Android-Mobile-Vision-Featured.jpg?fit=950%2C530&amp;ssl=1" src="https://i0.wp.com/www.truiton.com/wp-content/uploads/2017/05/Android-Mobile-Vision-Featured.jpg?resize=950%2C530" alt="Android Mobile Vision API" class="wp-image-1741" srcset="https://i0.wp.com/www.truiton.com/wp-content/uploads/2017/05/Android-Mobile-Vision-Featured.jpg?w=950&amp;ssl=1 950w, https://i0.wp.com/www.truiton.com/wp-content/uploads/2017/05/Android-Mobile-Vision-Featured.jpg?resize=600%2C335&amp;ssl=1 600w, https://i0.wp.com/www.truiton.com/wp-content/uploads/2017/05/Android-Mobile-Vision-Featured.jpg?resize=300%2C167&amp;ssl=1 300w, https://i0.wp.com/www.truiton.com/wp-content/uploads/2017/05/Android-Mobile-Vision-Featured.jpg?resize=768%2C428&amp;ssl=1 768w" sizes="(max-width: 950px) 100vw, 950px" /></figure></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">In August 2015, Google <a href="https://developers.google.com/vision/" target="_blank" rel="noopener noreferrer">announced</a> the release of Android Mobile Vision API. At that time this API had mainly three&nbsp;components Face Detection, Barcode scanner and ways to capture the tracking of objects in real time. But later on some bugs were found in its implementation, due to which the access to this API was restricted by Google&nbsp;to the existing users only. Then recently in <a href="https://developers.google.com/android/guides/releases" target="_blank" rel="noopener noreferrer">June 2016</a> these issues were resolved and Mobile Vision APIs were re-launched. But this time it had a few&nbsp;new features like OCR and scanning of Aztec barcodes. In the next sections lets understand what&nbsp;exactly is the new Mobile Vision API and how can we use it&nbsp;to&nbsp;build an efficient code base.</p>



<h2 class="wp-block-heading">&nbsp;</h2>



<h2 class="wp-block-heading">What is Android Mobile Vision API ?</h2>



<p class="wp-block-paragraph">Ever wondered how to detect a face, a QR code or a Bar code on an Android Device? If yes; you might have heard of, or used the&nbsp;<a href="http://developer.android.com/reference/android/media/FaceDetector.Face.html" target="_blank" rel="noopener noreferrer">FaceDetector.Face</a>&nbsp;API of the Android framework, or the OpenCV SDK, or maybe you had opted for a cloud based solution like <a href="http://www.truiton.com/2016/06/android-image-recognition-google-cloud-vision-api/" target="_blank" rel="noopener noreferrer">Cloud Vision API</a>,&nbsp;which makes the requests to a web server, fetching the results for&nbsp;scans. But this new Android Mobile Vision API does not make any requests to a web server. Instead it performs real time image/video scanning on the device itself. Although this&nbsp;may sound a little in-effective, but its not. The Mobile Vision API is very efficient and deeply integrated in to the Android system by the means of <a href="https://developers.google.com/android/guides/overview" target="_blank" rel="noopener noreferrer">Google Play Services SDK</a>. This gives this API&nbsp;an added advantage over all other solutions, as&nbsp;being&nbsp;a developer you do not need to integrate any third party SDK to perform media analysis. All you may need to do is <a href="https://developers.google.com/android/guides/setup" target="_blank" rel="noopener noreferrer">integrate the Google Play Services</a> properly and start building on it. Android Mobile Vision API as of now performs&nbsp;three types of image/stream detection as shown in next sections.</p>



<h2 class="wp-block-heading">Setting up Android Mobile Vision&nbsp;Library</h2>



<p class="wp-block-paragraph">When speaking of this new&nbsp;multipurpose Android offline image recognition library, the only downside is that one has to set it up before the actual usage. Although it does not mean any manual configuration but&nbsp;a tag needs to be added in the application manifest. So that the installer knows that an extra package is needed to be downloaded as the app is being installed. As of now the mobile vision API has three components, therefore all&nbsp;three&nbsp;dependencies can be included in a single manifest tag under the application tag as shown:</p>



<pre class="wp-block-preformatted lang:default decode:true">&lt;meta-data
            android:name="com.google.android.gms.vision.DEPENDENCIES"
            android:value="barcode,face,ocr"/&gt;</pre>



<p class="wp-block-paragraph">This would instruct the OS to download the packages for all three types of offline image analysis. Next lets have a brief understanding of all the features of this powerful Mobile Vision API.</p>



<h3 class="wp-block-heading">1. Barcode and QR Code scanning on Android</h3>



<p class="wp-block-paragraph">The Barcode Scanner API is used to scan various types of bar codes and qr codes. Some of them are:</p>



<ul class="wp-block-list"><li>1D barcodes: <a href="https://en.wikipedia.org/wiki/International_Article_Number_(EAN)" target="_blank" rel="noopener noreferrer">EAN-13, EAN-8</a>, <a href="https://en.wikipedia.org/wiki/Universal_Product_Code" target="_blank" rel="noopener noreferrer">UPC-A, UPC-E</a>, <a href="https://en.wikipedia.org/wiki/Code_39" target="_blank" rel="noopener noreferrer">Code-39</a>, <a href="https://en.wikipedia.org/wiki/Code_93" target="_blank" rel="noopener noreferrer">Code-93</a>, <a href="https://en.wikipedia.org/wiki/Code_128" target="_blank" rel="noopener noreferrer">Code-128</a>, <a href="https://en.wikipedia.org/wiki/Interleaved_2_of_5" target="_blank" rel="noopener noreferrer">ITF</a>, <a href="https://en.wikipedia.org/wiki/Codabar" target="_blank" rel="noopener noreferrer">Codabar</a></li><li>2D barcodes: <a href="https://en.wikipedia.org/wiki/QR_code" target="_blank" rel="noopener noreferrer">QR Code</a>, <a href="https://en.wikipedia.org/wiki/Data_Matrix" target="_blank" rel="noopener noreferrer">Data Matrix</a>, <a href="https://en.wikipedia.org/wiki/PDF417" target="_blank" rel="noopener noreferrer">PDF-417</a>, <a href="https://en.wikipedia.org/wiki/PDF417" target="_blank" rel="noopener noreferrer">AZTEC</a></li></ul>



<p class="wp-block-paragraph">Using this Mobile Vision API for Bar codes is very simple, even with so many supported formats. All you need to do is write around&nbsp;10&nbsp;lines of code to parse a Barcode or QR Code.&nbsp;One of the most interesting things about this API is that, it also parses the type of barcode/QR code it is scanning.&nbsp;All the information about the scanned barcode or QR Code type is found in the <code><code></code></code><a href="https://developers.google.com/android/reference/com/google/android/gms/vision/barcode/Barcode.html#valueFormat">valueFormat</a> field of Barcode Object besides the scanned barcode. To learn more about the usage of Barcode Scanner API of the Android Mobile Vision API please refer to this tutorial:</p>



<p class="wp-block-paragraph" style="text-align:center"><a class="fasc-button fasc-size-medium fasc-type-flat fasc-rounded-medium" style="background-color: #33809e; color: #ffffff;" target="_blank" rel="noopener noreferrer" href="http://www.truiton.com/2016/09/android-example-programmatically-scan-qr-code-and-bar-code/">Android Barcode Tutorial</a></p>



<h3 class="wp-block-heading">2. Optical Character Recognition (OCR)&nbsp;on Android</h3>



<p class="wp-block-paragraph">Mobile Vision Text API is another great feature packed into this library. Its purpose is straight forward, i.e. text recognition in an image or a stream of frames.&nbsp;It can recognize a majority of Latin character based languages like English, French, Italian Dutch etc. Therefore if your app needs to extract text out of an image, this is the perfect solution&nbsp;for you. As once its dependencies are downloaded, you no more required to have an internet connection, all the character recognition takes place on device itself.</p>



<p class="wp-block-paragraph">Incase you wonder; how would this Android Mobile Vision Text API deliver large results, as when scanning a page of a book- a lot of words could be scanned. But thankfully this API returns text in a structured way. It mainly divides text into three sections:</p>



<ol class="wp-block-list"><li><strong>Block</strong>: Top level structure, contains all the paragraphs.</li><li><strong>Line</strong>: Mid level structure, contains lines in a block.</li><li><strong>Word</strong>: Low level structure, contains a single word from line.</li></ol>



<p class="wp-block-paragraph">To learn more about the Text API, please refer to this tutorial:</p>



<p class="wp-block-paragraph" style="text-align:center"><a class="fasc-button fasc-size-medium fasc-type-flat fasc-rounded-medium" style="background-color: #33809e; color: #ffffff;" target="_blank" rel="noopener noreferrer" href="http://www.truiton.com/2016/11/optical-character-recognition-android-ocr/">Android OCR Tutorial</a></p>



<h3 class="wp-block-heading">3. Face Detection&nbsp;on Android</h3>



<p class="wp-block-paragraph">This is the most powerful API in&nbsp;all, as it has human&nbsp;Face Detection capabilities.&nbsp;It is a perfectly suited API for any face filter or camera app, as it performs the analysis on the device itself once the package is downloaded. Interestingly it not only recognizes a face but can also extract the facial features of that face, including eyes nose and mouth etc. Since this API as of now does not support face recognition it cannot identify similarity between two faces, but can still classify the features like, if the eyes are open or not. The functionalities that Mobile Vision Face Detection API supports are:</p>



<ol class="wp-block-list"><li><strong>Landmark Detection:</strong> Face API understands the human face in terms of landmarks.&nbsp;When a face is scanned via this API, it identifies that face via landmarks. In simple terms face landmarks are: nose, mouth, left eye, and right eye etc. By using this API you can actually extract the position of all these landmarks.&nbsp;</li><li><strong>Classification:</strong> This API not only scans a face but can also apply some basic logic and identify certain characteristics on the scanned face. For ex. with this feature we can find out whether the face has its eyes open or not. Also we can find out the probability of a smile on that face.&nbsp;</li><li><strong>Tracking:</strong> This is the most interesting feature of this API, you can actually track a face in a video sequence through this API. This feature of Mobile Vision API can be used to identify and track a face in a video. Once again this is not an application of face recognition, instead it tracks the face through movement of that particular face in the video.&nbsp;</li></ol>



<p class="wp-block-paragraph">To learn more in detail about Face Detection, please refer to this tutorial:</p>



<p class="wp-block-paragraph" style="text-align:center"><a class="fasc-button fasc-size-medium fasc-type-flat fasc-rounded-medium" style="background-color: #33809e; color: #ffffff;" target="_blank" rel="noopener noreferrer" href="http://www.truiton.com/2017/05/android-face-detection-example/">Face Detection Tutorial</a>&nbsp;</p>



<h2 class="wp-block-heading">Tracking Faces, Bar codes&nbsp;and QR Codes Simultaneously</h2>



<p class="wp-block-paragraph">Interestingly, if you want to scan and track multiple faces simultaneously, even that is possible through this API. All you need to do is initialize a <a href="https://developers.google.com/android/reference/com/google/android/gms/vision/MultiProcessor" target="_blank" rel="noopener noreferrer">MultiProcessor</a> and track multiple faces through this API. Also if you want to track multiple Bar codes or QR codes, same thing is applicable, as all of this is a part of <a href="http://www.truiton.com/2017/05/introducing-android-mobile-vision-api/">Mobile Vision API</a>, backed by Google Play Services. But even more interesting thing is that you can track Bar codes, QR codes and Faces in a single frame, by using the <a href="https://developers.google.com/android/reference/com/google/android/gms/vision/MultiDetector" target="_blank" rel="noopener noreferrer">MultiDetector</a> class of the same API suite. This makes the mobile vision APIs an outstanding leader in terms of features when compared to any other such library in the market. As its light, easy to integrate and very easy to use. For more updates, please connect with us on Twitter, Facebook and Google+.</p>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img alt='Mohit Gupt' src='https://secure.gravatar.com/avatar/a816092ad56645d2635ccfceb9f7e9d44821c19dec126cb394c882ba574eaa04?s=100&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/a816092ad56645d2635ccfceb9f7e9d44821c19dec126cb394c882ba574eaa04?s=200&#038;d=mm&#038;r=g 2x' class='avatar avatar-100 photo' height='100' width='100' itemprop="image"/></div><div class="saboxplugin-authorname"><a href="https://www.truiton.com/author/mohitgupt/" class="vcard author" rel="author"><span class="fn">Mohit Gupt</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>Born in New Delhi, India. A software engineer by profession, an android enthusiast and mobile development evangelist. My motive here is to create a group of skilled engineers, who can build better software. Reason being programming is my passion, and also it feels good to make a device do something you want. Professionally I have worked with many software engineering and product development firms. As of now too, I am employed as a senior engineer in a leading tech company. In total I may have worked on more than 20 projects professionally, but whenever I get spare time I share my thoughts here at Truiton.</p>
</div></div><div class="saboxplugin-web "><a href="http://www.truiton.com" target="_self" >www.truiton.com</a></div><div class="clearfix"></div><div class="saboxplugin-socials "><a title="Wordpress" target="_blank" href="https://www.truiton.com/author/mohitgupt/" rel="nofollow noopener" class="saboxplugin-icon-grey"><svg aria-hidden="true" class="sab-wordpress" role="img" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 512 512"><path fill="currentColor" d="M61.7 169.4l101.5 278C92.2 413 43.3 340.2 43.3 256c0-30.9 6.6-60.1 18.4-86.6zm337.9 75.9c0-26.3-9.4-44.5-17.5-58.7-10.8-17.5-20.9-32.4-20.9-49.9 0-19.6 14.8-37.8 35.7-37.8.9 0 1.8.1 2.8.2-37.9-34.7-88.3-55.9-143.7-55.9-74.3 0-139.7 38.1-177.8 95.9 5 .2 9.7.3 13.7.3 22.2 0 56.7-2.7 56.7-2.7 11.5-.7 12.8 16.2 1.4 17.5 0 0-11.5 1.3-24.3 2l77.5 230.4L249.8 247l-33.1-90.8c-11.5-.7-22.3-2-22.3-2-11.5-.7-10.1-18.2 1.3-17.5 0 0 35.1 2.7 56 2.7 22.2 0 56.7-2.7 56.7-2.7 11.5-.7 12.8 16.2 1.4 17.5 0 0-11.5 1.3-24.3 2l76.9 228.7 21.2-70.9c9-29.4 16-50.5 16-68.7zm-139.9 29.3l-63.8 185.5c19.1 5.6 39.2 8.7 60.1 8.7 24.8 0 48.5-4.3 70.6-12.1-.6-.9-1.1-1.9-1.5-2.9l-65.4-179.2zm183-120.7c.9 6.8 1.4 14 1.4 21.9 0 21.6-4 45.8-16.2 76.2l-65 187.9C426.2 403 468.7 334.5 468.7 256c0-37-9.4-71.8-26-102.1zM504 256c0 136.8-111.3 248-248 248C119.2 504 8 392.7 8 256 8 119.2 119.2 8 256 8c136.7 0 248 111.2 248 248zm-11.4 0c0-130.5-106.2-236.6-236.6-236.6C125.5 19.4 19.4 125.5 19.4 256S125.6 492.6 256 492.6c130.5 0 236.6-106.1 236.6-236.6z"></path></svg></span></a><a title="Twitter" target="_blank" href="http://twitter.com/mohitgupt" rel="nofollow noopener" class="saboxplugin-icon-grey"><svg aria-hidden="true" class="sab-twitter" role="img" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 30 30"><path d="M26.37,26l-8.795-12.822l0.015,0.012L25.52,4h-2.65l-6.46,7.48L11.28,4H4.33l8.211,11.971L12.54,15.97L3.88,26h2.65 l7.182-8.322L19.42,26H26.37z M10.23,6l12.34,18h-2.1L8.12,6H10.23z" /></svg></span></a><a title="Facebook" target="_blank" href="https://www.facebook.com/Mr.Mohit.Gupt" rel="nofollow noopener" class="saboxplugin-icon-grey"><svg aria-hidden="true" class="sab-facebook" role="img" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 264 512"><path fill="currentColor" d="M76.7 512V283H0v-91h76.7v-71.7C76.7 42.4 124.3 0 193.8 0c33.3 0 61.9 2.5 70.2 3.6V85h-48.2c-37.8 0-45.1 18-45.1 44.3V192H256l-11.7 91h-73.6v229"></path></svg></span></a></div></div></div><p>The post <a href="https://www.truiton.com/2017/05/introducing-android-mobile-vision-api/">Introducing Android Mobile Vision API</a> appeared first on <a href="https://www.truiton.com">Truiton</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.truiton.com/2017/05/introducing-android-mobile-vision-api/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1557</post-id>	</item>
		<item>
		<title>Optical Character Recognition on Android &#8211; OCR</title>
		<link>https://www.truiton.com/2016/11/optical-character-recognition-android-ocr/</link>
					<comments>https://www.truiton.com/2016/11/optical-character-recognition-android-ocr/#comments</comments>
		
		<dc:creator><![CDATA[Mohit Gupt]]></dc:creator>
		<pubDate>Sun, 06 Nov 2016 15:12:47 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Image Recognition]]></category>
		<category><![CDATA[Mobile Vision API]]></category>
		<category><![CDATA[OCR]]></category>
		<guid isPermaLink="false">http://www.truiton.com/?p=1606</guid>

					<description><![CDATA[<p>Android itself is a smart OS, still it lacked a very basic feature of text recognition. But not anymore; with the official Optical Character Recognition API of Android and the Mobile Vision library, now Android can perform OCR very efficiently and correctly. I did a very basic feature test to have a look at the&#8230;&#160;<a href="https://www.truiton.com/2016/11/optical-character-recognition-android-ocr/" rel="bookmark">Read More &#187;<span class="screen-reader-text">Optical Character Recognition on Android &#8211; OCR</span></a></p>
<p>The post <a href="https://www.truiton.com/2016/11/optical-character-recognition-android-ocr/">Optical Character Recognition on Android &#8211; OCR</a> appeared first on <a href="https://www.truiton.com">Truiton</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="aligncenter"><img data-recalc-dims="1" decoding="async" width="950" height="530" data-attachment-id="1612" data-permalink="https://www.truiton.com/2016/11/optical-character-recognition-android-ocr/android-ocr-library-featured/" data-orig-file="https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-Featured.jpg?fit=950%2C530&amp;ssl=1" data-orig-size="950,530" data-comments-opened="1" data-image-title="android-ocr-library-featured" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-Featured.jpg?fit=950%2C530&amp;ssl=1" src="https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-Featured.jpg?resize=950%2C530" alt="android ocr library - featured" class="wp-image-1612" srcset="https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-Featured.jpg?w=950&amp;ssl=1 950w, https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-Featured.jpg?resize=600%2C335&amp;ssl=1 600w, https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-Featured.jpg?resize=300%2C167&amp;ssl=1 300w, https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-Featured.jpg?resize=768%2C428&amp;ssl=1 768w" sizes="(max-width: 950px) 100vw, 950px" /></figure></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Android itself is a smart OS, still it lacked a very basic feature of text recognition. But not anymore; with the official Optical Character Recognition API of Android and the Mobile Vision library, now Android can perform OCR very efficiently and correctly. I did a very basic feature test to have a look at the new functionality and found out its very fast and easy to use. Here in this Optical Character Recognition(OCR) example of Android, I would simply import the library, click a picture of a piece of text and look for text blocks in it. But before doing so lets take an overview of Android Mobile Vision API to understand the working of Text API better.</p>



<h2 class="wp-block-heading">Android Mobile Vision Library</h2>



<p class="wp-block-paragraph">Consider a scenario where you wish to scan&nbsp;and an image or a video stream and&nbsp;detect&nbsp;faces, barcodes, QR codes or Text in&nbsp;it on Android. Astonishingly till now no such framework existed on Android. But now Google has introduced <a href="https://developers.google.com/vision/" target="_blank" rel="noopener noreferrer">Mobile Vision APIs</a>. These set of APIs&nbsp;provide a very easy to use programming interfaces through which we can scan Faces, Barcodes, QR Codes and Text without writing huge amount of code.&nbsp;And the best part is that these can be used offline as well, i.e. only once when the app is downloaded the required dependencies are downloaded, post that an internet connection is not required any more. As this feature is introduced on Android through the Google Play services.&nbsp;To enable your app to use Mobile Vision APIs, you need to add this dependency in your <code>build.gradle</code> file:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">compile 'com.google.android.gms:play-services-vision:11.4.0'</pre>



<p class="wp-block-paragraph">Please Note: Learn more on how to <a href="https://developers.google.com/android/guides/setup" target="_blank" rel="noopener noreferrer">setup Google Play Services</a>. Or learn more about <a href="http://www.truiton.com/2017/05/introducing-android-mobile-vision-api/">Mobile Vision API</a>.</p>



<h2 class="wp-block-heading">Introducing an Android OCR Library &#8211; Text Recognition API</h2>



<p class="wp-block-paragraph">Since the Android OS was brought on to production devices, Optical Character Recognition has been a common area of research. But this <a href="https://developers.google.com/vision/text-overview" target="_blank" rel="noopener noreferrer">Text Recognition API</a> of Mobile Vision suite would bring all these researches to a stop. As this Google powered API contains&nbsp;features like multiple language recognition where languages are like : English, French, German, Spanish or&nbsp;any other Latin based text. Also the text can be parsed from a stream of frames i.e. a video and displayed on the screen in real time as displayed in the image above. But due to the scope of this Android OCR Library example we would keep things simple and scan the text from an image only, as this tutorial is targeted for beginners. Apart from this the interesting part is, all this is done offline by the Google Play services itself, i.e. no internet connection is required after once it has been set up in the app (shown in steps ahead). &nbsp;Now when it comes to structuring the text,&nbsp;this&nbsp;Android OCR library not only recognizes the text but can also divide the&nbsp;captured text into the following categories:</p>



<ol class="wp-block-list"><li>Block &#8211;&nbsp;<code><code></code></code><a href="https://developers.google.com/android/reference/com/google/android/gms/vision/text/TextBlock" target="_blank" rel="noopener noreferrer">TextBlock</a> &#8211; A top level object where a scanned paragraph or column is&nbsp;captured.</li><li>Line &#8211; <code><code></code></code><a href="https://developers.google.com/android/reference/com/google/android/gms/vision/text/Line" target="_blank" rel="noopener noreferrer">Line</a> &#8211; A line of text captured from a block of text.</li><li>Word &#8211; <code><code></code></code><a href="https://developers.google.com/android/reference/com/google/android/gms/vision/text/Element" target="_blank" rel="noopener noreferrer">Element</a> &#8211; A single word recognized in a <code>Line</code>.</li></ol>



<h2 class="wp-block-heading">Android OCR Example</h2>



<p class="wp-block-paragraph">Now that we have a basic understanding of Android OCR library, particularly the Text Recognition API. I will demonstrate by an example where we would simply take a picture and scan for text in it. Now as a thumb rule to do so first we may need to set up our Android app to download the play services dependency for&nbsp;Optical Character Recognition. Therefore please&nbsp;include the block of code below in your manifest&nbsp;to instruct installer to download the OCR dependency at the time of installing the app.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;meta-data
            android:name="com.google.android.gms.vision.DEPENDENCIES"
            android:value="ocr"/></pre>



<p class="wp-block-paragraph"><span style="text-decoration: underline;">Please Note:</span> <em>This is not a mandatory step, but helps in downloading the dependencies beforehand. Also the link to full source code is at the end of this tutorial.</em></p>



<p class="wp-block-paragraph">Next lets define a layout to display the scanned results:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="xml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;?xml version="1.0" encoding="utf-8"?>
&lt;android.support.constraint.ConstraintLayout
    android:id="@+id/activity_main"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.truiton.mobile.vision.ocr.MainActivity">

    &lt;ImageView
        android:id="@+id/imageView"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_marginTop="16dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@mipmap/truiton"
        tools:layout_constraintLeft_creator="1"
        tools:layout_constraintRight_creator="1"/>

    &lt;Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:text="Scan Text"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        tools:layout_constraintLeft_creator="1"
        tools:layout_constraintRight_creator="1"
        />

    &lt;TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:text="Scan Results:"
        android:textAllCaps="false"
        android:textStyle="normal|bold"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/imageView"
        tools:layout_constraintLeft_creator="1"
        tools:layout_constraintRight_creator="1"/>

    &lt;ScrollView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="8dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView"
        tools:layout_constraintTop_creator="1"
        tools:layout_constraintRight_creator="1"
        tools:layout_constraintBottom_creator="1"
        tools:layout_constraintLeft_creator="1">

        &lt;LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            &lt;TextView
                android:id="@+id/results"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                tools:layout_constraintLeft_creator="1"
                tools:layout_constraintRight_creator="1"
                tools:layout_constraintTop_creator="1"/>
        &lt;/LinearLayout>
    &lt;/ScrollView>
&lt;/android.support.constraint.ConstraintLayout>
</pre>



<p class="wp-block-paragraph">I was playing around with <code><code></code></code><a href="https://developer.android.com/training/constraint-layout/index.html" target="_blank" rel="noopener noreferrer">ConstraintLayout</a> in Android. Hence made it in Constraint layout, although its not a requirement to use <code>ConstraintLayout</code> for this Android OCR Library example. The above layout basically contains a <code>ScrollView</code> to accurately display the scanned text. Next lets define the main Activity:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">package com.truiton.mobile.vision.ocr;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.vision.Frame;
import com.google.android.gms.vision.text.Text;
import com.google.android.gms.vision.text.TextBlock;
import com.google.android.gms.vision.text.TextRecognizer;

import java.io.File;
import java.io.FileNotFoundException;

public class MainActivity extends AppCompatActivity {
    private static final String LOG_TAG = "Text API";
    private static final int PHOTO_REQUEST = 10;
    private TextView scanResults;
    private Uri imageUri;
    private TextRecognizer detector;
    private static final int REQUEST_WRITE_PERMISSION = 20;
    private static final String SAVED_INSTANCE_URI = "uri";
    private static final String SAVED_INSTANCE_RESULT = "result";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        scanResults = (TextView) findViewById(R.id.results);
        if (savedInstanceState != null) {
            imageUri = Uri.parse(savedInstanceState.getString(SAVED_INSTANCE_URI));
            scanResults.setText(savedInstanceState.getString(SAVED_INSTANCE_RESULT));
        }
        detector = new TextRecognizer.Builder(getApplicationContext()).build();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ActivityCompat.requestPermissions(MainActivity.this, new
                        String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_PERMISSION);
            }
        });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case REQUEST_WRITE_PERMISSION:
                if (grantResults.length &gt; 0 &amp;&amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    takePicture();
                } else {
                    Toast.makeText(MainActivity.this, "Permission Denied!", Toast.LENGTH_SHORT).show();
                }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == PHOTO_REQUEST &amp;&amp; resultCode == RESULT_OK) {
            launchMediaScanIntent();
            try {
                Bitmap bitmap = decodeBitmapUri(this, imageUri);
                if (detector.isOperational() &amp;&amp; bitmap != null) {
                    Frame frame = new Frame.Builder().setBitmap(bitmap).build();
                    SparseArray&lt;TextBlock&gt; textBlocks = detector.detect(frame);
                    String blocks = "";
                    String lines = "";
                    String words = "";
                    for (int index = 0; index &lt; textBlocks.size(); index++) {
                        //extract scanned text blocks here
                        TextBlock tBlock = textBlocks.valueAt(index);
                        blocks = blocks + tBlock.getValue() + "\n" + "\n";
                        for (Text line : tBlock.getComponents()) {
                            //extract scanned text lines here
                            lines = lines + line.getValue() + "\n";
                            for (Text element : line.getComponents()) {
                                //extract scanned text words here
                                words = words + element.getValue() + ", ";
                            }
                        }
                    }
                    if (textBlocks.size() == 0) {
                        scanResults.setText("Scan Failed: Found nothing to scan");
                    } else {
                        scanResults.setText(scanResults.getText() + "Blocks: " + "\n");
                        scanResults.setText(scanResults.getText() + blocks + "\n");
                        scanResults.setText(scanResults.getText() + "---------" + "\n");
                        scanResults.setText(scanResults.getText() + "Lines: " + "\n");
                        scanResults.setText(scanResults.getText() + lines + "\n");
                        scanResults.setText(scanResults.getText() + "---------" + "\n");
                        scanResults.setText(scanResults.getText() + "Words: " + "\n");
                        scanResults.setText(scanResults.getText() + words + "\n");
                        scanResults.setText(scanResults.getText() + "---------" + "\n");
                    }
                } else {
                    scanResults.setText("Could not set up the detector!");
                }
            } catch (Exception e) {
                Toast.makeText(this, "Failed to load Image", Toast.LENGTH_SHORT)
                        .show();
                Log.e(LOG_TAG, e.toString());
            }
        }
    }

    private void takePicture() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File photo = new File(Environment.getExternalStorageDirectory(), "picture.jpg");
        imageUri = FileProvider.getUriForFile(MainActivity.this,
                BuildConfig.APPLICATION_ID + ".provider", photo);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(intent, PHOTO_REQUEST);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        if (imageUri != null) {
            outState.putString(SAVED_INSTANCE_URI, imageUri.toString());
            outState.putString(SAVED_INSTANCE_RESULT, scanResults.getText().toString());
        }
        super.onSaveInstanceState(outState);
    }

    private void launchMediaScanIntent() {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        mediaScanIntent.setData(imageUri);
        this.sendBroadcast(mediaScanIntent);
    }

    private Bitmap decodeBitmapUri(Context ctx, Uri uri) throws FileNotFoundException {
        int targetW = 600;
        int targetH = 600;
        BitmapFactory.Options bmOptions = new BitmapFactory.Options();
        bmOptions.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(ctx.getContentResolver().openInputStream(uri), null, bmOptions);
        int photoW = bmOptions.outWidth;
        int photoH = bmOptions.outHeight;

        int scaleFactor = Math.min(photoW / targetW, photoH / targetH);
        bmOptions.inJustDecodeBounds = false;
        bmOptions.inSampleSize = scaleFactor;

        return BitmapFactory.decodeStream(ctx.getContentResolver()
                .openInputStream(uri), null, bmOptions);
    }
}
</pre>



<p class="wp-block-paragraph">In the above piece of code, I simply initialized&nbsp;a <code>TextRecognizer</code> and asked the user to grant the permission to store the captured image on disk. Post which, when an image like shown below is captured, we resize the image in method&nbsp;<code>decodeBitmapUri</code> to a smaller size so that, it can be scanned faster. Once the image is scaled, we check for operational&nbsp;<code>TextRecognizer</code>. Then after the detector is operational, we scan out the text from picture.</p>



<div class="wp-block-image"><figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="800" height="448" data-attachment-id="1616" data-permalink="https://www.truiton.com/2016/11/optical-character-recognition-android-ocr/android-ocr-library-1/" data-orig-file="https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-1.png?fit=800%2C448&amp;ssl=1" data-orig-size="800,448" data-comments-opened="1" data-image-title="android-ocr-library-1" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-1.png?fit=800%2C448&amp;ssl=1" src="https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-1.png?resize=800%2C448" alt="android ocr library" class="wp-image-1616" srcset="https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-1.png?w=800&amp;ssl=1 800w, https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-1.png?resize=600%2C336&amp;ssl=1 600w, https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-1.png?resize=300%2C168&amp;ssl=1 300w, https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-1.png?resize=768%2C430&amp;ssl=1 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure></div>



<p class="wp-block-paragraph">When the Android OCR library &#8211; the Mobile Vision, returned the text from the picture above, it was very accurate. Have a look at the result below:</p>



<div class="wp-block-image"><figure class="aligncenter"><img data-recalc-dims="1" loading="lazy" decoding="async" width="272" height="480" data-attachment-id="1617" data-permalink="https://www.truiton.com/2016/11/optical-character-recognition-android-ocr/android-ocr-library-2/" data-orig-file="https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-2.gif?fit=272%2C480&amp;ssl=1" data-orig-size="272,480" data-comments-opened="1" data-image-title="android-ocr-library-2" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-2.gif?fit=272%2C480&amp;ssl=1" src="https://i0.wp.com/www.truiton.com/wp-content/uploads/2016/11/Android-OCR-Library-2.gif?resize=272%2C480" alt="android ocr library " class="wp-image-1617"/></figure></div>



<p class="wp-block-paragraph">For full source code, please refer to the link below:</p>



<p class="wp-block-paragraph" style="text-align:center"><a class="fasc-button fasc-size-large fasc-type-flat fasc-rounded-medium ico-fa fasc-ico-before fa-github" style="background-color: #0364af; color: #ffffff;" target="_blank" rel="noopener noreferrer" href="https://github.com/Truiton/MobileVisionAPI/tree/master/OCRSample">Full Source Code</a></p>



<p class="wp-block-paragraph">Hence I believe this is one of the best OCR libraries available for Android till date. As it gives the unique capability of offline text scanning, without compromising on&nbsp;quality.&nbsp;Therefore if you have to make an app where it is required to scan the text and process it, use the Text API of Mobile Vision for Optical Character Recognition. For more posts like this, please connect with us on Twitter, Facebook and Google+. Hope this helped.</p>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img alt='Mohit Gupt' src='https://secure.gravatar.com/avatar/a816092ad56645d2635ccfceb9f7e9d44821c19dec126cb394c882ba574eaa04?s=100&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/a816092ad56645d2635ccfceb9f7e9d44821c19dec126cb394c882ba574eaa04?s=200&#038;d=mm&#038;r=g 2x' class='avatar avatar-100 photo' height='100' width='100' itemprop="image"/></div><div class="saboxplugin-authorname"><a href="https://www.truiton.com/author/mohitgupt/" class="vcard author" rel="author"><span class="fn">Mohit Gupt</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>Born in New Delhi, India. A software engineer by profession, an android enthusiast and mobile development evangelist. My motive here is to create a group of skilled engineers, who can build better software. Reason being programming is my passion, and also it feels good to make a device do something you want. Professionally I have worked with many software engineering and product development firms. As of now too, I am employed as a senior engineer in a leading tech company. In total I may have worked on more than 20 projects professionally, but whenever I get spare time I share my thoughts here at Truiton.</p>
</div></div><div class="saboxplugin-web "><a href="http://www.truiton.com" target="_self" >www.truiton.com</a></div><div class="clearfix"></div><div class="saboxplugin-socials "><a title="Wordpress" target="_blank" href="https://www.truiton.com/author/mohitgupt/" rel="nofollow noopener" class="saboxplugin-icon-grey"><svg aria-hidden="true" class="sab-wordpress" role="img" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 512 512"><path fill="currentColor" d="M61.7 169.4l101.5 278C92.2 413 43.3 340.2 43.3 256c0-30.9 6.6-60.1 18.4-86.6zm337.9 75.9c0-26.3-9.4-44.5-17.5-58.7-10.8-17.5-20.9-32.4-20.9-49.9 0-19.6 14.8-37.8 35.7-37.8.9 0 1.8.1 2.8.2-37.9-34.7-88.3-55.9-143.7-55.9-74.3 0-139.7 38.1-177.8 95.9 5 .2 9.7.3 13.7.3 22.2 0 56.7-2.7 56.7-2.7 11.5-.7 12.8 16.2 1.4 17.5 0 0-11.5 1.3-24.3 2l77.5 230.4L249.8 247l-33.1-90.8c-11.5-.7-22.3-2-22.3-2-11.5-.7-10.1-18.2 1.3-17.5 0 0 35.1 2.7 56 2.7 22.2 0 56.7-2.7 56.7-2.7 11.5-.7 12.8 16.2 1.4 17.5 0 0-11.5 1.3-24.3 2l76.9 228.7 21.2-70.9c9-29.4 16-50.5 16-68.7zm-139.9 29.3l-63.8 185.5c19.1 5.6 39.2 8.7 60.1 8.7 24.8 0 48.5-4.3 70.6-12.1-.6-.9-1.1-1.9-1.5-2.9l-65.4-179.2zm183-120.7c.9 6.8 1.4 14 1.4 21.9 0 21.6-4 45.8-16.2 76.2l-65 187.9C426.2 403 468.7 334.5 468.7 256c0-37-9.4-71.8-26-102.1zM504 256c0 136.8-111.3 248-248 248C119.2 504 8 392.7 8 256 8 119.2 119.2 8 256 8c136.7 0 248 111.2 248 248zm-11.4 0c0-130.5-106.2-236.6-236.6-236.6C125.5 19.4 19.4 125.5 19.4 256S125.6 492.6 256 492.6c130.5 0 236.6-106.1 236.6-236.6z"></path></svg></span></a><a title="Twitter" target="_blank" href="http://twitter.com/mohitgupt" rel="nofollow noopener" class="saboxplugin-icon-grey"><svg aria-hidden="true" class="sab-twitter" role="img" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 30 30"><path d="M26.37,26l-8.795-12.822l0.015,0.012L25.52,4h-2.65l-6.46,7.48L11.28,4H4.33l8.211,11.971L12.54,15.97L3.88,26h2.65 l7.182-8.322L19.42,26H26.37z M10.23,6l12.34,18h-2.1L8.12,6H10.23z" /></svg></span></a><a title="Facebook" target="_blank" href="https://www.facebook.com/Mr.Mohit.Gupt" rel="nofollow noopener" class="saboxplugin-icon-grey"><svg aria-hidden="true" class="sab-facebook" role="img" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 264 512"><path fill="currentColor" d="M76.7 512V283H0v-91h76.7v-71.7C76.7 42.4 124.3 0 193.8 0c33.3 0 61.9 2.5 70.2 3.6V85h-48.2c-37.8 0-45.1 18-45.1 44.3V192H256l-11.7 91h-73.6v229"></path></svg></span></a></div></div></div><p>The post <a href="https://www.truiton.com/2016/11/optical-character-recognition-android-ocr/">Optical Character Recognition on Android &#8211; OCR</a> appeared first on <a href="https://www.truiton.com">Truiton</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.truiton.com/2016/11/optical-character-recognition-android-ocr/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1606</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Minified using Disk

Served from: www.truiton.com @ 2026-07-02 22:15:41 by W3 Total Cache
-->