鑽戒
Storm
2016年9月19日 星期一
2016年4月8日 星期五
C++ 取得 特定資料夾下 的檔案名稱
利用 _findfirst 與 _findnext 完成
程式圖片:
程式碼:
利用 _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 檔案放到主程式資料夾
程式碼:
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)
程式碼:
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 編譯或調整環境變數)
範例程式碼:
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);
}
訂閱:
文章 (Atom)