通過HomeBrew安裝管理OpenCV
安裝HomeBrew:官網
https://brew.sh
安裝CMake: 官網https://cmake.org, 配置CMake的環境變量
檢查OpenCV版本:brew search "opencv"
安裝OpenCV指定版本: brew install
opencv@3
卸載OpenCV指定版本: brew uninstall
opencv@3
新建Xcode工程
關聯OpenCV如圖:

代碼:
//
// main.cpp
// MainOpenCV
//
// Created by wenqiang on 26/9/2019.
// Copyright © 2019 tools.master.com. All rights reserved.
//
#include <iostream>
#include <opencv2/opencv.hpp>
#include "stasm.h"
//using namespace cv;
int main(int argc, const char * argv[]) {
// insert code here...
cv::Mat img = cv::imread("[圖片絕對路徑]", CV_LOAD_IMAGE_UNCHANGED); //以上路徑為我的一張圖片
if(img.empty()) {
fprintf(stderr, "failed to load input image\n");
return -1;
}
//=======================檢查臉的參數=======================
// 參數1
int foundface;
/*
* 參數2
* stasm_NLANDMARKS 是 stasm的一個宏 一個int值 值為77 表示可以獲取到77個點
* 乘以2 是因為返回的值是float 每一個點都有x,y 返回值為:x0, y0, x1, y1, 相當於兩個元素才能合成一個點
*/
float landmarks[2 * stasm_NLANDMARKS];
/*
* 參數3
* 圖片的灰度圖, 可以直接使用OpenCV的方法獲取
*/
// 將UIImage 轉成 cv::Mat
cv::Mat cvFaceImage = img;
//UIImageToMat(image, cvFaceImage);
// 將cv::Mat的image 轉成灰度圖
// CV_RGBA2GRAY 表示 將四通道RGBA的圖片 轉成灰度圖 iOS中圖片默認是RGBA的
cv::Mat cvGrayFaceImage;
cv::cvtColor(cvFaceImage, cvGrayFaceImage, CV_RGBA2GRAY);
const char* imgData = (const char*)cvGrayFaceImage.data;
//參數4/5 圖片的寬高 cv::Mat 的圖片可以直接取
int imgCols = cvGrayFaceImage.cols;
int imgRows = cvGrayFaceImage.rows;
// 參數6 不傳
/*
* 參數7 訓練庫文件的目錄
* 這里需要注意 iOS獲取項目中文件 需要通過Bundle獲取
* [NSBundle mainBundle].bundlePath 作為目錄 是可以拿到項目中所以文件的 不管有沒有其他子文件夾了。
* 其他平台中, 那么就指定路徑
*/
//const char *xmlPath = [[NSBundle mainBundle].bundlePath UTF8String];
const char *xmlPath = "[分離器絕對路徑]";
// 方法有返回值 如果為0 那么就說明方法調用出現問題
int stasmActionError = stasm_search_single(&foundface, landmarks, imgData, imgCols, imgRows, "", xmlPath);
if (!stasmActionError){
// 通過打印 stasm_lasterr() 可以看到錯誤信息
printf("Error in stasm_search_single: %s\n", stasm_lasterr());
}
cv::Mat result;
if (!foundface) {
printf("No face found");
result = cvGrayFaceImage;
} else {
// 這里就說明已經獲取到關鍵點了
// 將關鍵點顯示出來
// 將RGBA四通道的圖片 轉成 BGR三通道
cv::Mat cvFaceImage_BGR;
cv::cvtColor(cvFaceImage, cvFaceImage_BGR, CV_RGBA2BGR);
for (int i = 0; i < stasm_NLANDMARKS; i++){
// 生成一個當前點腳標的String字符串
std::string number = std::to_string(i);
// 獲取中心點 根據x在前 y在后 兩個元素為一個點的順序
cv::Point center(cvRound(landmarks[i * 2 ]), cvRound(landmarks[i * 2+1]));
// 將點畫上去
cv::circle(cvFaceImage_BGR, center, 0.25, cv::Scalar(255, 0, 0), 2, 8, 0);
// 將腳標也畫上去
cv::putText(cvFaceImage_BGR,number,center, cv::FONT_HERSHEY_PLAIN,0.7, cv::Scalar(0, 0, 255));
}
// 將BGR三通道的圖片 轉成 RGBA四通道
cv::Mat cvFaceImageResult;
cv::cvtColor(cvFaceImage_BGR, cvFaceImageResult, CV_BGR2RGBA);
//繪制出關鍵點的image
//result = MatToUIImage(cvFaceImageResult);
result = cvFaceImageResult;
cvFaceImage_BGR.release();
cvFaceImageResult.release();
}
// 釋放cv::Mat
cvFaceImage.release();
cvGrayFaceImage.release();
//=======================檢查臉結束=======================
cv::imshow("Display Image", result);
cv::waitKey(0);
return 0;
}