直接獲取攝像頭傳回的影象資料(人臉、微笑、眨眼: 識別-->第一步):影象識別第一步
轉:ios通過攝像頭獲取特定資料(http://www.2cto.com/kf/201404/290777.html)
註釋: 由於最近專案需求,需要一個能夠實現對攝像頭圖片獲取其中部分內容的功能,類似於二維碼掃描。但是隻需要獲取特定位置的畫素塊進行簡單計算即可,所以聽上去還是很簡單的,但是經過實踐,發現,現實似乎與想象中不一樣,由於攝像頭拍到的資料,採用的是QZ(也就是CG框架)進行繪製,所以涉及到座標系與frame的座標系不一致的問題。1:嘗試直接拿到攝像頭資料,先輸出看下。 code: 程式碼略。
總結: 直接使用攝像頭資料再用imageView的方式顯示出來的時刻,我們發現,資料是正確的==。所見即所得的方式。 需要注意的是: 當圖片是橫向拍攝的時刻,我們可以看到,相機會自動將圖片進行90度旋轉,也就是說,
所以: 我們使用imageView對拿到的資料進行展示的時刻,資料並沒有顛倒的現象。為了防止出現這個現象的原因是出於imageView的內部實現,我們使用CgimageRef的方式,再次驗證 從攝像頭拿到的資料真的和我們所看到的一樣嗎?
code:
CGImageRef oldImageRef=image.CGImage;
UIImage* newImage=[UIImage imageWithCGImage:oldImageRef];
註釋:在這裡,我們只是對拿到的Image物件,先轉換成了CGimage,再使用UIImage的方法得到新的Image物件。
結果:我們發現,得到的影象果然就是旋轉90度的圖片,而不再是原圖了。
UIImage* newImage=[UIImage imageWithCGImage:oldImageRef scale:.1 orientation:UIImageOrientationRight];
使用上面的語句,可以將影象旋轉90度變成我們需要的樣子。思考:
這麼簡單的變化中,圖片會不會丟失資料? ---------
NSData* data=UIImageJPEGRepresentation(image, 0);
NSLog(@"%lu",(unsigned long)data.length);
還好,資料沒有丟失。既然資料沒有丟失,那麼我們應該可以獲取到其中特定的一塊資料得出,再顯示出來才對。
問題來了: 我們要獲取某一塊資料的內容,我們應該怎麼傳遞rect呢?因為我們預設的rect與CG的座標系並不同。是否需要轉換呢?
1:我們先試一下,先把資料轉過來,再從裡面拿一部分. code:
CGImageRef imageRef=image.CGImage;
CGImageRef newimage=CGImageCreateWithImageInRect(imageRef, rect);
結果發現: 拿到的資料還是傾斜了90度。也就是說,我們上面對資料這樣的轉換其實根本沒有起到作用,資料在底層儲存的方式就是使用CG的座標系儲存的。
經過試驗發現,[UIImage imageWithCGImage:oldImageRef scale:.1 orientation:UIImageOrientationRight]中,對orientation的改變,不會對我們的實驗結果產生任何影響。 也就是說,這個方法,其實並沒有對底層的資料進行操作,而只不過是在初始化新的UIImage的時刻,對底層畫素的讀取,orientation不同,方向也不同而已。
思考:
因為,我們使用上面的方法,並沒有操作到底層的畫素矩陣,也就是我,我們如果想要解決這個問題,有兩種方式, 1:將底層資料矩陣轉換成我們需要的對應座標系的內容。 這也就是CTM轉換。 將Image物件內部資料進行轉換。 code: ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
-
(UIImage *)image:(UIImage *)image rotation:(UIImageOrientation)orientation
{
long double rotate
= 0.0 ;
CGRect
rect;
float translateX
= 0 ;
float translateY
= 0 ;
float scaleX
=
|