NDK44_Camke集成OpenCv

NDK开发汇总

百度opencv,下载正式版本对应的windows平台sdk包,安装

一 引入OpenCv库

visualStudio新建Cmake项目,配置cmakeList

cmake_minimum_required (VERSION 3.8)

include_directories("C:/rj/opencv/build/include")
link_directories("C:/rj/opencv/build/x64/vc15/lib")

# 将源代码添加到此项目的可执行文件。
add_executable (FaceTracking "FaceTracking.cpp" "FaceTracking.h")
target_link_libraries( FaceTracking opencv_world3412d)
# TODO: 如有需要,请添加测试并安装目标。

二 使用OpenCv

FaceTracking.h

// FaceTracking.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。

#pragma once

#include <iostream>
#include <opencv2/opencv.hpp>


using namespace cv;

class CascadeDetectorAdapter : public DetectionBasedTracker::IDetector
{
public:
	CascadeDetectorAdapter(cv::Ptr<cv::CascadeClassifier> detector) :
		IDetector(),
		Detector(detector){
		
		CV_Assert(detector);
	}

	void detect(const cv::Mat &Image, std::vector<cv::Rect> &objects)
	{
		
		Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);

	}

	virtual ~CascadeDetectorAdapter()
	{
		
	}

private:
	CascadeDetectorAdapter();
	cv::Ptr<cv::CascadeClassifier> Detector;
};

// TODO: 在此处引用程序需要的其他标头。

FaceTracking.cpp

// FaceTracking.cpp: 定义应用程序的入口点。
//

#include "FaceTracking.h"

#define LBP 
/**
 * 原始lbp:应该是3x3的src(先不管3x3)
 * src: 原图
 * dst: 计算出的lbp图谱
 *
*/
void processLBP(Mat src, Mat &dst) {
	// 循环处理图像数据
	for (int i = 1; i < src.rows - 1; i++) {
		for (int j = 1; j < src.cols - 1; j++) {
			uchar lbp = 0;
			//原图的像素(灰度值)
			uchar center = src.at<uchar>(i, j);
			//取出对应 高、宽位置的像素 与 中心点位置进行比较
			//src.at<uchar>(i - 1, j - 1) 取出位置的灰度值
			//左上角  
			if (src.at<uchar>(i - 1, j - 1) > center) { lbp += 1 << 7; }
			//当前的上面一个
			if (src.at<uchar>(i - 1, j	  ) > center) { lbp += 1 << 6; }
			//右上角
			if (src.at<uchar>(i - 1, j + 1) > center) { lbp += 1 << 5; }
			if (src.at<uchar>(i, j + 1	  ) > center) { lbp += 1 << 4; }
			if (src.at<uchar>(i + 1, j + 1) > center) { lbp += 1 << 3; }
			if (src.at<uchar>(i + 1, j    ) > center) { lbp += 1 << 2; }
			if (src.at<uchar>(i + 1, j - 1) > center) { lbp += 1 << 1; }
			if (src.at<uchar>(i, j - 1    ) > center) { lbp += 1 << 0; }
			dst.at<uchar>(i - 1, j - 1    ) = lbp;
		}
	}
}

int main()
{
#ifdef LBP
	//读取一张图片
	Mat img = imread("D:/Lance/ndk/opencv/test.jpg");
	cv::cvtColor(img, img, COLOR_BGR2GRAY);
	imshow("src", img);
	//计算lbp图谱 高(行)、宽(列)
	Mat lbp = Mat(img.rows - 2, img.cols - 2, CV_8UC1);
	processLBP(img, lbp);
	imshow("lbp",lbp);
	waitKey();
	return 0;
#else

	/**
	*   显示摄像头的图像
	*/
	//智能指针
	Ptr<CascadeClassifier> classifier = makePtr<CascadeClassifier>("D:/Lance/ndk/opencv/opencv-3.4.3-android-sdk/OpenCV-android-sdk/sdk/etc/lbpcascades/lbpcascade_frontalface.xml");
	//创建一个跟踪适配器
	Ptr<CascadeDetectorAdapter> mainDetector = makePtr<CascadeDetectorAdapter>(classifier);

	Ptr<CascadeClassifier> classifier1 = makePtr<CascadeClassifier>("D:/Lance/ndk/opencv/opencv-3.4.3-android-sdk/OpenCV-android-sdk/sdk/etc/lbpcascades/lbpcascade_frontalface.xml");
	//创建一个跟踪适配器
	Ptr<CascadeDetectorAdapter> trackingDetector = makePtr<CascadeDetectorAdapter>(classifier1);

	//拿去用的跟踪器
	DetectionBasedTracker::Parameters DetectorParams;
	Ptr<DetectionBasedTracker> tracker = makePtr<DetectionBasedTracker>(mainDetector, trackingDetector, DetectorParams);
	//开启跟踪器
	tracker->run();
	
	VideoCapture capture(0);
	Mat img;
	Mat gray;
	while (1)
	{
		capture >> img;
		// img的 颜色空间是 BGR,不像现在,早期的计算机中主流是bgr,而不是rgb
		cvtColor(img, gray,COLOR_BGR2GRAY);
		//增强对比度 (直方图均衡)
		equalizeHist(gray, gray);
		std::vector<Rect> faces;
		//定位人脸 N个
		tracker->process(gray);
		tracker->getObjects(faces);
		//classifier->detectMultiScale(gray, faces);
		for (Rect face : faces) {
			//画矩形
			//分别指定 bgra
			rectangle(img, face, Scalar(255, 0, 255));
		}
		imshow("摄像头", img);
		//延迟10ms 如果10s内你没有输入 空格 
		waitKey(30);
	}

	tracker->stop();
	return 0;
#endif
	
}

三 添加dll

  • 全部重新生成,输入日志中找到项目生成exe的文件路径;
  • 找到自己安装opencv的路径,复制openCv对应的dll库到exe路径下

(C:\rj\opencv\build\x64\vc15\bin\opencv_world3412d.dll )

  • 编译运行

四 Demo

FaceTracking

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值