2016年4月8日 星期五

C++ 取得 特定資料夾下 的檔案名稱

利用 _findfirst 與 _findnext 完成

程式圖片:




程式碼:

#include <stdio.h>
#include <string.h>
#include <io.h> //c_file
#include <direct.h> 
#include <iostream>
using namespace std;
void main()
{
 char sdir[256], filter[256], path[256];
 struct _finddata_t c_file;
 intptr_t hFile;

 strcpy_s(sdir, "human");
 strcpy_s(filter, "*.jpg");

 _chdir(sdir);
 hFile = _findfirst(filter, &c_file);
 if (hFile != -1)
 {
  do {
   sprintf_s(path, "%s\\%s", sdir, c_file.name);
   cout << path<<endl;
  } while (_findnext(hFile, &c_file) == 0);
 }
 system("pause");
}


2016年4月7日 星期四

OpenCV 3.1 Face Recognition

OpenCV 3.1 人臉辨識

程式截圖:





請先將 openCV 內的訓練好的 xml 檔案放到主程式資料夾





程式碼:

#include <opencv\highgui.h>
#include <opencv\cv.h>
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;

void detectAndDisplay(Mat);

String face_cascade_name = "haarcascade_frontalface_default.xml";
CascadeClassifier face_cascade;

int main()
{
 if (!face_cascade.load(face_cascade_name))
 {
  printf("--(!)Error loading\n");
  return -1;
 }
 Mat frame = imread("3.jpg", 1); //這裡請改你想放的圖片路徑
 imshow("image", frame);
 detectAndDisplay(frame);
 waitKey(0);
 return 0;
}
void detectAndDisplay(Mat frame)
{
 vector<Rect> faces;
 Mat frame_gray;

 cvtColor(frame, frame_gray, CV_BGR2GRAY);

 //-- Detect faces
 face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(10, 10));

 for (int i = 0; i < faces.size(); i++)
 {
  Point p1(faces[i].x, faces[i].y);
  Point p2(faces[i].x + faces[i].width, faces[i].y + faces[i].height);

  rectangle(frame, p1, p2, Scalar(0, 0, 255), 2, 0);
 }

 imshow("face detect", frame);
}

2016年3月25日 星期五

OpenCV 3.0 Thresh & adaptive Thresh API

OpenCV 3.0 閥值 與 自適性閥值

程式原圖:



程式效果:

Thresh


Adaptive thresh


Threshold 的用途,可以把圖片中的顏色一分為二,較暗的像素會變成黑色。

較亮的像素會轉成白色。

在車牌偵測、字型偵測上會常用到。

因為車牌的顏色固定,而且對比大,所以利用這種門閥 API 可以取得滿意的結果。

程式專案檔:門閥範例專案檔 Google 下載空間 (64bit OpenCV 3.0)

程式碼:

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

using namespace std;
using namespace cv;
//golbal variable
#define WINDOW_NAME "Thresh"
int thresholdValue = 100;
int thresholdType = 3;
Mat srcImg, grayImg, dstImg,dstImg_adaptive;
//golbal function
void on_threshold(int, void*);
int main()
{
 srcImg = imread("plate.jpg");//only thing you have to do is to change the picture name
 imshow("sourceImg", srcImg);
 cvtColor(srcImg, grayImg, COLOR_RGB2GRAY);
 imshow("grayImg", grayImg);
 namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
 //crate trackbar at here
 createTrackbar("Mode", WINDOW_NAME, &thresholdType,5, on_threshold);//select mode
 createTrackbar("Variable Value", WINDOW_NAME, &thresholdValue, 255, on_threshold);
 on_threshold(0, 0);

 //adaptive
 adaptiveThreshold(grayImg, dstImg_adaptive, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 111, 2);
 imshow("adaptive", dstImg_adaptive);

 while (true)
 {
  int key;
  key = waitKey(20);
  if (char(key) == 27)
   break;
 }
 return 0;
}
void on_threshold(int, void*)
{
 
  threshold(grayImg, dstImg, thresholdValue, 255, thresholdType);
  imshow(WINDOW_NAME, dstImg);
 
}





以下介紹 OpenCV 提供的五種濾波器

OpenCV 3.0 Box Filter, Mean Blur, Gaussian Blur, Median Blur, Bilateral filter:

(OpenCV 3.0 方框濾波、平均值模糊、高斯模糊、中間值模糊、雙邊模糊)

程式執行範例:

原圖


中間值濾波過後


如果環境中存在許多"極端"雜訊,使用中間值濾波器能得到很好的效果。

如果要做的事情是減少自然界常態雜訊或減少細節層次,會選擇高斯濾波。

如果希望運算快速,使用 Box Filter。

如果想保留邊緣資訊,又想要減少雜訊或做模糊的效果,使用雙邊濾波。

所以說根據不同的需求,選擇不同的濾波器,才能達到最好的效果。

範例專案檔:程式範例專案檔Google下載空間 (請選擇 64bit 編譯或調整環境變數)

範例程式碼:

#include<iostream>
#include<opencv2\opencv.hpp>
using namespace cv;
using namespace std;
//全域變數宣告------------------------------------------
Mat srcImg, dstImg_box, dstImg_mean, dstImg_gauss, dstImg_median, dstImg_bilateral;
int boxValue = 6;   //方框濾波
int meanValue = 10;  //平均值濾波
int gaussValue = 6;  //高斯濾波
int medianValue = 10;//中間值濾波
int bilateralValue = 10;//雙邊濾波

//function 宣告----------------------------------------
static void on_box(int, void*);
static void on_mean(int, void*);
static void on_gauss(int, void*);
static void on_median(int, void*);
static void on_bilater(int, void*);
int main()
{
 //原圖讀取
 srcImg = imread("testImg.jpg", 1);  //使用範例時請更改圖片路徑
 imshow("srcImg", srcImg);
 //將所有圖片copy 一份給 destination圖片
 dstImg_box = srcImg.clone();
 dstImg_mean = srcImg.clone();
 dstImg_gauss = srcImg.clone();
 dstImg_median = srcImg.clone();
 dstImg_bilateral = srcImg.clone();
 //----------1. 方框濾波-----------
 namedWindow("1.Box");
 createTrackbar("核心值:", "1.Box", &boxValue, 50, on_box);
 on_box(boxValue,0);
 imshow("1.Box",dstImg_box);
 //----------2. 平均值濾波---------
 namedWindow("2.Mean");
 createTrackbar("核心值:", "2.Mean", &meanValue, 50, on_mean);
 on_mean(meanValue, 0);
 imshow("2.Mean", dstImg_mean);
 //----------3. 高斯濾波-----------
 namedWindow("3.Gauss");
 createTrackbar("參數:","3.Gauss",&gaussValue,50,on_gauss);
 on_gauss(gaussValue,0);
 imshow("3.Gauss", dstImg_gauss);
 //----------4. 中值濾波------------
 namedWindow("4.Median");
 createTrackbar("遮罩參數:", "4.Median", &medianValue, 50, on_median);
 on_median(medianValue, 0);
 imshow("4.Median", dstImg_median);
 //----------5. 雙邊濾波------------
 namedWindow("5.Bilateral");
 createTrackbar("參數:", "5.Bilateral", &bilateralValue, 50, on_bilater);
 on_bilater(bilateralValue, 0);
 imshow("5.Bilateral", dstImg_bilateral);
 
 waitKey(0);
 return 0;   
}
static void on_box(int, void*)//
{
 boxFilter(srcImg, dstImg_box, -1, Size(boxValue + 1, boxValue + 1));
 imshow("1.Box", dstImg_box);
}
static void on_mean(int, void*)
{
 blur(srcImg, dstImg_mean,  Size(meanValue + 1, meanValue + 1),Point(-1,-1));
 imshow("2.Mean", dstImg_mean);
}
static void on_gauss(int, void*)
{
 GaussianBlur(srcImg, dstImg_gauss, Size(gaussValue*2 + 1, gaussValue*2 + 1),0,0);
 imshow("3.Gauss", dstImg_gauss);
}
static void on_median(int, void*)
{
 medianBlur(srcImg, dstImg_median,medianValue*2+1);
 imshow("4.Median", dstImg_median);
}
static void on_bilater(int, void*)
{
 bilateralFilter(srcImg, dstImg_bilateral, bilateralValue , bilateralValue * 2 , bilateralValue/2);
 imshow("5.Bilateral", dstImg_bilateral);
}