1. 程式人生 > >iOS中使用opencv進行影象識別操作(一)步驟很多,這一篇只是講了第一步.

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 ,但是仍然報出了之前說的那個錯誤, 感謝 

StackOberflow 讓我找到了問題發生的原因。所以對於 C++ 標頭檔案的引用一定要注意,但凡是引用了 A.h 的實現部分,都必須是.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。