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);
}

2016年3月22日 星期二

學習 OpenCV 前須有的基本觀念與認知

一、影像處理、電腦視覺與 OpenCV

影像處理 ( Image processing) 為對影像進行分析、運算以達到滿意結果的技術,影像處理的技術包含影像壓縮、增強、復原、比對、描述、識別等部分。

電腦視覺 (Computer Vision) 為一門教機器模擬生物、人類視覺的科學,具體上是指利用攝影機或電腦代替肉眼對目標進行識別、追蹤和測量。在應用上可用於自動化機器生產、安全監控系統、自動駕駛車、娛樂體感遊戲、3D重建等方面。

影像處理與電腦視覺的差別在於,影像處理著重在處理影像,例如去雜訊、還原、分割...等;而電腦視覺著重於模擬人類視覺,進行辨識、偵測等模擬。

OpenCV (Open source computer vision library) 為一個開放程式碼跨平台的電腦視覺庫,內含許多影像處理與電腦視覺方面的演算法,是目前電腦視覺領域主流工具之一。


二、OpenCV 概述

OpenCV 於 1999 年由 Intel 建立,如今由 Willow Garage 提供支援,可用於 Linux 、 Windows 、 Mac 、OS 、 Android 、 iOS .... 等作業系統上, OpenCV 由 C 與 C++ 類別構成,容量小、執行效率高,OpenCV 除了能用 C/C++ 之外,還支援 C# 、 Ruby 等程式語言,同時提供 Python 、 Ruby 、 Matlab 等語言的介面。

OpenCV 已於 2015 年 12月 21 日發布 OpenCV 3.1 版本。