OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现

OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现


[-= 博客目录 =-]


1-学习目标

1.1-本章介绍

如题,实现简单人脸检测,及Undefined symbols for architecture x86_64问题相关解决方案。

1.2-实践内容

  1. 环境配置
  2. 解决Undefined symbols for architecture x86_64问题
  3. 测试代码

1.3-相关说明

Mac+xcode+OpenCV外部库导入

返回目录

2-学习目标

2.1-环境配置

  • searchpath设置:
    如图,具体怎么找可以参见(零)

  • 导入外部库
    如图(其实多了,但是为了方便就一起导入了)

返回目录

2.2-解决Undefined symbols for architecture x86_64问题

在完成配置后,进行build,弹出错误:

Undefined symbols for architecture x86_64
……(具体内容略)
clang: error: linker command failed with exit code 1

这个是个经典问题,主要的原因是在自己的电脑上编译其他环境下的代码时会遇到的(如果之前没有配置好),我在网上搜到了很多解决办法,整理了一套具体的排除故障方法:

  1. 检查Link Binary With Libraries是否忘记添加系统某些库文件或自定义类文件:
    图片
    如果缺失就点“+”号添加,如果找不到就点击“add other”,如果在隐藏的usr中就用command+shift+G键直接进取,具体操作可以参考(零)。
  2. 检查工程文件路径是否正确:

    没有设置就赶紧设置
  3. 检查Link Binary With Libraries添加的库、类是否有重名,有重名就去掉,重新改名导入。
  4. 检查Build settings->Linking->Other Linker Flags选项
    如果导入的是第三方库,则需要将属性设置为-all_load 或者 -ObjC
  5. 检查”Build Settings”->”Enable Bitcode”设置为NO ,因为有些SDK不支持Bitcode,这个问题比较少见。

以上是网上的方法,我操作过后……
完!全!没!用!

在我抓耳挠腮了一个下午之后,祭出排除法,一步一步的试错,终于在睡觉前灵光一闪,找到了问题所在……

1是我之前导入的库,不行,但是如果导入2就可以,我看了看图标发现2的右下角有个小箭头,我想原因应该是1是没有编译好的库,导入之后xcode才会报找不到库的错,因为根本没链接上。

返回目录

2.3-测试代码

参考网上的代码基于Opencv的人脸检测及识别,稍微有些改动

#include <iostream>
#include <string>

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;
using namespace std;
string xmlPath="/Users/mac/Study/OpenCV/opencv-3.4.1/data/haarcascades/haarcascade_frontalface_default.xml";
//xmlpath 记录.xml文件的路径
void detectAndDisplay(Mat image);
int main( int argc,char**argv )
{
    string path="/Users/mac/Study/C/Face-Identify/search-img/5.jpg";//以检测图片4.jpg为例
    Mat image =imread(path,-1);
    
    CascadeClassifier a;     //创建脸部对象
    if(!a.load(xmlPath))     //如果读取文件不出错,则检测人脸
    {
        cout<<"无法加载xml文件"<<endl;
        return 0;
    }
    detectAndDisplay(image);// 检测人脸
    return 0;
    
}

void detectAndDisplay(Mat image)
{
    CascadeClassifier ccf;      //创建脸部对象
    ccf.load(xmlPath);           //导入opencv自带检测的文件
    vector<Rect> faces;
    Mat gray;
    cvtColor(image,gray,CV_BGR2GRAY);
    equalizeHist(gray,gray);
    ccf.detectMultiScale(gray,faces,1.1,3,0,Size(50,50),Size(500,500));
    for(vector<Rect>::const_iterator iter=faces.begin();iter!=faces.end();iter++)
    {
        rectangle(image,*iter,Scalar(0,0,255),2,8); //画出脸部矩形
    }
    Mat image1;
    
    for(size_t i=0;i<faces.size();i++)
    {
        Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
        image1= image(Rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height));
    }
    
    imshow("1",image);
    imshow("2",image1);
    cvWaitKey(0);
    
}

效果如下:

返回目录

3-资料

  1. 基于Opencv的人脸检测及识别
  2. IOS学习笔记64--关于linker command failed with exit code错误
  3. Xcode出现( linker command failed with exit code 1)错误总结
  4. 一分钟解决Xcode的Undefined symbols for architecture x86_64编译错误
  5. facedetect.cpp

返回目录

原文地址:https://www.cnblogs.com/blackay03/p/8989062.html