vs下opencv的人臉檢測以及qt下dll的封裝調用(二、dll的創建)

一、vs下新建main.cpp
// dllmain.cpp : 定義 DLL 應用程序的入口點。  
#include <windows.h>  
BOOL APIENTRY DllMain(HMODULE hModule,
	DWORD  ul_reason_for_call,
	LPVOID lpReserved
	)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}
二、新建detectdll.cpp

#include "opencv/cv.hpp"  
#include "opencv2/objdetect/objdetect.hpp"  
#include "opencv2/highgui/highgui.hpp"  
#include "opencv2/imgproc/imgproc.hpp"  
#include <time.h>
#include <iostream>  
#include <stdio.h>  
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
IplImage* cutImage(IplImage* src, CvRect rect) {
	cvSetImageROI(src, rect);
	IplImage* dst = cvCreateImage(cvSize(rect.width, rect.height),

		src->depth,
		src->nChannels);

	cvCopy(src, dst, 0);
	cvResetImageROI(src);
	return dst;
}

IplImage* detect1(Mat& img, CascadeClassifier& cascade, double scale)
{
	int i = 0;
	double t = 0;
	vector<Rect> faces;
	Mat gray, smallImg(cvRound(img.rows / scale), cvRound(img.cols / scale), CV_8UC1);

	cvtColor(img, gray, CV_BGR2GRAY);
	resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR);
	equalizeHist(smallImg, smallImg);

	t = (double)cvGetTickCount();
	cascade.detectMultiScale(smallImg, faces,
		1.3, 2, CV_HAAR_SCALE_IMAGE,
		Size(80, 80));
	t = (double)cvGetTickCount() - t;
	printf("detection time = %g ms\n", t / ((double)cvGetTickFrequency()*1000.));
	for (vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++)
	{
		IplImage* temp = cutImage(&(IplImage(img)), cvRect(r->x, r->y, r->width, r->height));
		return temp;
	}

	return NULL;
}

IplImage* det(Mat srcImg, char* path, String cascadeName){

	IplImage *dst1 = 0;			//目標圖像指針
	IplImage *dst2 = 0;			//目標圖像指針
	CvSize dst_cvsize;			//目標圖像尺寸
	CascadeClassifier cascade;
	if (!cascade.load(cascadeName))
	{
		cout << "cascade not load" << endl;
	}


	IplImage* faceImage1;
	clock_t start2, finish2;
	double totaltime2;
	start2 = clock();
	faceImage1 = detect1(srcImg, cascade, 1);
	finish2 = clock();
	totaltime2 = (double)(finish2 - start2) / CLOCKS_PER_SEC;
	std::cout << "detectface time is :" << totaltime2 << "sec" << std::endl;


	if (faceImage1 == NULL) {

		cout << "no image" << endl;
	}


	dst_cvsize.width = 224;		//目標圖像的寬爲源圖象寬的scale倍
	dst_cvsize.height = 224;		//目標圖像的高爲源圖象高的scale倍

	dst1 = cvCreateImage(dst_cvsize, faceImage1->depth, faceImage1->nChannels);	//構造目標圖象
	//   cvResize(src, dst, CV_INTER_LINEAR);	//縮放源圖像到目標圖像
	cvResize(faceImage1, dst1, CV_INTER_CUBIC);		//縮放源圖像到目標圖像

	cvSaveImage(path, dst1, 0);



	//    cvSaveImage("d:\\face.jpg", faceImage1, 0);  


	cv::Mat im1 = cv::cvarrToMat(dst1);


	cvReleaseImage(&faceImage1);
	return dst1;

}
三、新建頭文件detectdll.h

#include "opencv/cv.hpp"  
#include "opencv2/objdetect/objdetect.hpp"  
#include "opencv2/highgui/highgui.hpp"  
#include "opencv2/imgproc/imgproc.hpp"  
#include <time.h>
#include <iostream>  
#include <stdio.h>  
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;

IplImage* cutImage(IplImage* src, CvRect rect);
IplImage* detect1(Mat& img, CascadeClassifier& cascade, double scale);
IplImage* det(Mat srcImg, char* path, String cascadeName);
四、新建source.def

把函數寫在這裏,然後空格@+數字,如果某個函數報錯,試着改個名字(我的detect函數一直抱錯,換成detect1就好了)

LIBRARY "detectdll"  
EXPORTS  
     cutImage @1  
     detect1 @2  
     det @3  
五、重新生成就好拉



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章