iOS中使用opencv進行影象識別操作(一)步驟很多,這一篇只是講了第一步.
前言
OpenCV ,是一個開源的跨平臺計算機視覺和機器學習庫,通俗點的說,就是他給計算機提供了一雙眼睛,一雙可以從圖片中獲取資訊的眼鏡,從而完成人臉識別、去紅眼、追蹤移動物體等等的影象相關的功能。更多具體的說明可參見 OpenCV 官網。
匯入工程
匯入 OpenCV 到 Xcode 的工程中還是比較簡單的,從官網下載對應的 framework,直接丟到 Xcode 的工程中,然後在你想用 OpenCV 的地方引入 OpenCV 的標頭檔案:
#import <opencv2/opencv.hpp>
或者直接在 PCH 檔案中新增:
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif
然後把使用到 OpenCV 中 C++方法的實現檔案字尾名改成.mm
,就可以開始使用 OpenCV 的方法了。看起來很簡單,對吧?確實是很簡單,不過這裡有一些要注意的地方,我們一起來看看。
實際問題
首先說明,為何在 PCH 檔案中引入 OpenCV 的標頭檔案我們需要多加#ifdef __cpluseplus
這一部分呢?這是因為 PCH 檔案是一個會被所有的檔案引入的標頭檔案,而我們又希望 #import <opencv2/opencv.hpp>
這部分只會被一些 C++實現檔案編譯,所以我們加上#ifdef __cpluseplus
來表示這是 C++ 檔案才會編譯的,除了#ifdef __cpluseplus
#ifdef __OBJC__
這樣的巨集來說明編譯規則(按照 OC 檔案編譯),這樣的巨集多出現於一些會被多種型別的實現檔案引用的標頭檔案中。另外注意另一個問題:如果一個頭檔案是C++型別的標頭檔案,那麼一定要保證所有直接或者間接引用這個標頭檔案的實現檔案都要為.mm
或者.cpp
,否則 Xcode 就不會把這個標頭檔案當做 C++標頭檔案來編譯,就會出現最基本的#include <iostream>
這種引用都會報出file not found
這樣的編譯錯誤的問題。我在編譯的過程中,某個C++標頭檔案 A.h 被 B.h 引用,然後 B.h 又被 C.m 引用,雖然 B 的實現檔案是 B.mm ,但是仍然報出了之前說的那個錯誤, 感謝 .mm
或者.cpp
字尾名。(同時我們也可以知道,Xcode 是根據標頭檔案被引用的情況來判定標頭檔案的編譯 型別的)。
轉換 UIImage 和 cv::Mat
在 OpenCV 中同常用 cv::Mat 表示圖片,而 iOS 中則是 UIImage 來表示圖片,因此我們就需要一些轉換的方法,OpenCV 的官方教程中給吃了轉換的方法,這裡摘錄如下:
UIImage To cv::Mat:
- (cv::Mat)cvMatFromUIImage:(UIImage *)image
{
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
CGFloat cols = image.size.width;
CGFloat rows = image.size.height;
cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha)
CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to data
cols, // Width of bitmap
rows, // Height of bitmap
8, // Bits per component
cvMat.step[0], // Bytes per row
colorSpace, // Colorspace
kCGImageAlphaNoneSkipLast |
kCGBitmapByteOrderDefault); // Bitmap info flags
CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
CGContextRelease(contextRef);
return cvMat;
}
cv::Mat To UIImage:
-(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat
{
NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];
CGColorSpaceRef colorSpace;
if (cvMat.elemSize() == 1) {//可以根據這個決定使用哪種
colorSpace = CGColorSpaceCreateDeviceGray();
} else {
colorSpace = CGColorSpaceCreateDeviceRGB();
}
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
// Creating CGImage from cv::Mat
CGImageRef imageRef = CGImageCreate(cvMat.cols, //width
cvMat.rows, //height
8, //bits per component
8 * cvMat.elemSize(), //bits per pixel
cvMat.step[0], //bytesPerRow
colorSpace, //colorspace
kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info
provider, //CGDataProviderRef
NULL, //decode
false, //should interpolate
kCGRenderingIntentDefault //intent
);
// Getting UIImage from CGImage
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return finalImage;
}
更多問題,歡迎加群討論:qq群 :565191947
相關推薦
iOS中使用opencv進行影象識別操作(一)步驟很多,這一篇只是講了第一步.
前言OpenCV ,是一個開源的跨平臺計算機視覺和機器學習庫,通俗點的說,就是他給計算機提供了一雙眼睛,一雙可以從圖片中獲取資訊的眼鏡,從而完成人臉識別、去紅眼、追蹤移動物體等等的影象相關的功能。更多具體的說明可參見 OpenCV 官網。匯入工程匯入 OpenCV 到 Xco
android中利用opencv進行影象識別
之前開發的時候老大讓研究下影象識別的功能,同事推薦看看opencv,發現對於移動端來說opencv的資料和demo都比較少,現在整理下之前的工作成果。 首先是進行配置工作,先匯入opencv的一個程式碼模組 之後是匯入opencv的具體的演算法,當然是c
iOS 利用GPUImage 進行影象處理操作(入門篇)
影象入門處理GPUImage (適合剛接觸影象處理人的使用) 總結:共六部 建立處理樣式的物件 設定樣式的屬性 獲取要進行操作的資料來源 *增加濾鏡 開始渲染 建立渲染之後的圖片 並展示出 程式碼塊 以對影象處理懷舊樣式為例,例如:
我的郵箱又收到了一封信,這一次,關乎愛情
發件人: 「維克多多多的」 傳送時間: 2018年12月1日 收件人: 上官冷兒 主題: 獨白 by @「維克多多多的」 某友,你好呀! 我現在
使用opencv的dnn模組進行影象識別
專案地址:https://github.com/zhongqianli/cifar10_classification.git opencv3.4的dnn模組已經支援caffe、tensorflow、pytorch等主流深度學習框架訓練的模型。 本文用caffe預先在cifar10
【影象處理】使用OpenCV進行影象處理教程(一)
OpenCV是進行影象處理的工具,也是計算機視覺領域近十幾年不斷髮展和完善的產物。面對這個已基本成熟的開源庫知識體系,我們新生代有必要不斷地總結、回顧,以新的視角快速融入計算機視覺的奧祕世界。 從這篇隨
使用OpenCV進行影象處理-改變影象的亮度與對比度
通過OpenCV,製作一個有關影象處理的在Linux下的軟體。 製作可以自動處理影象亮度的簡單軟體。 開發環境:CodeBlocks #include <iostream> #incl
用C#進行影象識別與資料採集進而實現對視訊裡的資料採集
窗體佈局的滑鼠移動距離問題oledb資料型別不一致如何更新窗體佈局的滑鼠移動距離問題oledb資料型別不一致如何更新 我的vs2008今天怎麼不能用了啊麻煩進來看看為什麼開發windowsForm程式Gridview隱身無法使用我的vs2008今天怎麼不能用了啊麻煩進來看看為
深度學習框架Tensorflow學習與應用(八 儲存和載入模型,使用Google的影象識別網路inception-v3進行影象識別)
一 模型的儲存 [email protected]:~/tensorflow$ cat 8-1saver_save.py # coding: utf-8 # In[1]: import tensorflow as tf from tensorflow.examples.tutorials
基於ROS使用OpenCV進行影象的邊緣檢測
1 硬體 攝像頭:1個; USB資料線:1個; 1.1 準備 這裡需要使用usb-cam軟體包: $ cd ~/catkin_ws/src $ git clone https://github.com/bosch-ros-pkg/usb_cam.git $
java 使用 Tess4J 進行影象識別
在網上找了好多關於orc的資料,文件自己也demo了好幾個都不咋地靠譜.後來發現一個挺不錯的文件,自己也試著demo了下沒有 再想前幾個一樣報各種未知的錯誤. 轉 原文地址 圖片成功識別出來,但是識別率還是有點低.. 第一步下載 Tess4J 的一些資源 &nbs
python使用opencv進行人臉識別
#include "cv.h" #include "highgui.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #includ
MFC多文件中opencv處理影象開啟、儲存
需要在C**Doc和C**View中進行相應修改 影象開啟: Doc.cpp中: BOOL CCVMFCDoc::Load(IplImage** pp, LPCTSTR csFilename) { IplImage* pImg=NULL; pImg = cvLoa
序列影象識別分類專案筆記 前期工作(一)
目前想法: 1、先做一般的動作識別分類,然後再遷移到特定行為; 2、先用資料集做,再用不分割的視訊改進。 資料庫: Real-world Anomaly Detection in Surveillance Videos, arxiv 1801.04264):提出了
使用opencv進行人臉識別
介紹 從OpenCV2.4開始,加入了新的類FaceRecognizer,我們可以使用它便捷地進行人臉識別實驗。本文既介紹程式碼使用,又介紹演算法原理。 目前支援的演算法有 Eigenfaces特徵臉createEigenFaceRecognizer() Fisherfaces createFisherFa
OpenCV進行影象相似度對比的幾種辦法
對計算影象相似度的方法,本文做了如下總結,主要有三種辦法: 1.PSNR峰值信噪比 PSNR(Peak Signal to Noise Ratio),一種全參考的影象質量評價指標。 PSNR是最普遍和使用最為廣泛的一種影象客觀評價指標,然而
matlab 關於利用深度學習進行影象識別
深度學習進行影象識別現在主要 是利用CNN來進行操作,其中影象預處理涉及到灰度處理,零均值,影象分割,影象增強等等,比較多。最近在用matlab進行影象識別這一方面的實驗,在matlab官網上出了很多這樣的例子,提出裡兩種方法:training from scratch和tr
OpenCV實現影象識別
最近參加了一個機器人比賽,本人負責影象識別和串列埠通訊方面的任務工作。串列埠通訊的教程可以見我的部落格;下面主要總結一下我對影象識別的整個學習過程。 開發環境 Mac OS Xcode C++ OpenCV 2.4.12 思考過程 實現影象識別
在android平臺上利用opencv進行影象處理之邊沿檢測
由於專案的需要,這幾天開始接觸opencv,要在android平臺上利用opencv進行影象處理。以下是這幾天的成果: 執行結果如下: 原始圖片: 處理後的圖片: Java程式碼: package com.cdq.opencvtest; import java.
Windows下Python+OpenCV+zbar影象識別二維碼識別編譯環境安裝
一、準備檔案 二、安裝 1、python庫的安裝 點選下載下的python-2.7.14.amd64.msi,一路next下去,安裝完成後,配置環境變數,在path裡面加入安裝的python的根目錄,例如本人安裝目錄d:\Python27。