這裡我先示範一個
載入靜態圖的範例
row-major_vs_column-major
簡易視窗配置
如何鎖住 imageBox 物件的 滾輪自動放大縮小功能
以及 右鍵 作效果等功能
右側 ---> 找到 Functional Mode 把 預設的 Everything 改成
這樣可以將emgucv imageBox物件提供的右鍵及滾輪縮放等功能先鎖住!!!!!!
練習畫圖的部分
第一階段程式碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.Util;
using Emgu.CV.ML;
namespace emgucv_note
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Image<Bgr, byte> imgBg = new Image<Bgr, byte>(512, 512); //畫布 空的 預設黑色
//備註:Image<Gray, byte> 預設也是黑色喔!!!
imageBox1.Image = imgBg;
}
}
}
怎麼改變畫布顏色呢??
示意圖
第二階段程式碼 _改變背景色
第一種寫法
imgBg.Data[i, j, 0] = 255;
代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.Util;
using Emgu.CV.ML;
namespace emgucv_note
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Image<Bgr, byte> imgBg = new Image<Bgr, byte>(512, 512);
//Image<Gray, byte> imgGrayBg = new Image<Gray, byte>(512, 512);
for(int i=0;i<imgBg.Width;i++)
for(int j=0;j<imgBg.Height;j++)
{
imgBg.Data[i, j, 0] = 255; //B
imgBg.Data[i, j, 1] = 0; //G
imgBg.Data[i, j, 2] = 0; //R
}
imageBox1.Image = imgBg;
}
}
}
第二種寫法
先取出 畫布資料用 Byte陣列存
代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.Util;
using Emgu.CV.ML;
namespace emgucv_note
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Image<Bgr, byte> imgBg = new Image<Bgr, byte>(512, 512);
//Image<Gray, byte> imgGrayBg = new Image<Gray, byte>(512, 512);
byte[] imgTmp = imgBg.Bytes;
for(int i=0;i<imgBg.Width;i++)
for(int j=0;j<imgBg.Height;j++)
{
int n = i * imgBg.Width + j; // row-major 的 寫法
imgTmp[n * 3] = 0; //B
imgTmp[n * 3 + 1] = 255;//G
imgTmp[n * 3 + 2] = 0;//R
}
imgBg.Bytes = imgTmp;
imageBox1.Image = imgBg;
}
}
}
row-major
column-major
A column-major ordered matrix. Elements are stored in memory in the order shown by the arrow.
靜/動態影像貼圖_示範
商業應用
SNOW - 自拍、臉部辨識貼圖、超有趣相機
Photo Booth 拍照系統
Kinect 拍照系統 宜達國際股份有限公司 工讀合作案 (from 班導)
http://www.pro-fotoimagic.com.tw/about.html
Kinect V2 部分 : 學習自 微軟MVP Vangos Pterneas
http://pterneas.com/
WPF視窗程式部份 : 學習自 游寶達教授 及其 助教 蔡政宇 博士生
https://www.youtube.com/watch?v=s5Hrgl0OD2w&list=PLcOD6drVLxLNBW4I37Ei5-Aq2zaJXRV5E&index=1
完成了第一階段收穫及心得 :
我比其他人多學會一種視窗程式語言、視窗真的滿多公司要求的 嗚嗚嗚 不能只會opencv
還有自學完成了這個第一階段 十分有成就感 呼呼~~ YA
希望後續能繼續順利 結論:從完全不會但是善用youtube就可以成就一些事情
宜達國際股份有限公司 工讀合作案
工作要求:
第一階段
幫忙寫出
Kinect 去背效果然後要可以選取背景
要有視窗介面
要可以切換畫面(進行跳頁)
不可顯示上方醜陋工具列(放大/縮小/關閉的視窗列)
第二階段
要加上相框(融入背景後的壓前框) 進行拍照存檔
寫出臉部偵測 進行趣味貼圖
題外話 扯遠了~~~~
首先我們先新增一個C#專案
第一階段 _ 先秀靜態圖 成功讀取顯示一張個人照片
第一階段讀圖程式碼
第二階段 人臉偵測示範
效果
多添加了一個 button 用來做 偵測 當然準確率會有誤差
使用 emgucv bin 目錄下 提供的 haarcascade_frontalface_default 的 xml 進行人臉偵測
將此檔案放置於你程式專案的
同學這裡告訴你一個小秘密
去下載opencv之後
在目錄下的
這裡都可以做使用喔!!!
第二階段 人臉偵測示範 程式碼:
如果想學習 opencv 版本 可以參考下方兩個link
Opencv_臉譜分類器_研究_part1(臉部到眼睛_CascadeClassifier類介紹_參數)
http://coolmandiary.blogspot.tw/2016/01/opencv.html
Opencv_臉譜分類器_研究_part2(如何貼面具在臉部實現戴面具效果)
http://coolmandiary.blogspot.tw/2016/02/opencvpart2.html
opencv_海爾訓練剖析_L1
http://coolmandiary.blogspot.tw/2016/05/opencvl1.html第三階段 靜態圖上貼圖_示範
自己上網找 帽子的圖
如果有現成的png圖檔再好不過
沒有就自己去去背
去背線上網站工具推薦
https://burner.bonanza.com/
Photoshop 去背簡易教學
https://www.youtube.com/watch?v=AZc3jb3L3BI
貼一張圖上去
貼 png 的效果
程式碼小示範
這是未去背直接貼上去的效果
那這裡呢 教大家一招 帥招
首先我們去 小畫家 把 帽子 這張 jpg 圖檔
被景色 改為 黑色
程式碼 做點小更改
先讓小塊的帽子影像跟原圖的感興趣區塊相加
然後再貼到原圖上面去
這裡我們就可以改高度及寬度了
改到合適區塊
目前程式碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.Util;
using Emgu.CV.CvEnum;
namespace emgucv_paste_exercise
{
public partial class Form1 : Form
{
#region Globle Var
Image<Bgr, byte> img;
#endregion
public Form1()
{
InitializeComponent();
}
private void btnOpenImage_Click(object sender, EventArgs e)
{
string strFileName = string.Empty;
OpenFileDialog ofd = new OpenFileDialog();
if(ofd.ShowDialog() == DialogResult.OK)
{
img = new Image<Bgr, byte>(ofd.FileName);
pictureBox1.Image = img.ToBitmap();
}
}
private void btnStaticPaste_Click(object sender, EventArgs e)
{
string strFileName = string.Empty;
OpenFileDialog ofd = new OpenFileDialog();
Image<Bgr, byte> texture ;
if (ofd.ShowDialog() == DialogResult.OK)
{
texture = new Image<Bgr, byte>(ofd.FileName);
img.ROI = new Rectangle(img.Width/2-45, img.Height/4-65, texture.Width, texture.Height);
texture = texture + img;
texture.CopyTo(img);
img.ROI = new Rectangle();
pictureBox1.Image = img.ToBitmap();
}
}
private void btnFaceDetect_Click(object sender, EventArgs e)
{
List<Rectangle> faces = new List<Rectangle>();
CascadeClassifier face = new CascadeClassifier("haarcascade_frontalface_alt.xml");
Image<Gray, byte> grayImg = img.Convert<Gray, byte>();
//Face Detect
Rectangle[] faceDetected = face.DetectMultiScale(grayImg,
1.1,
10,
new Size(30,30),
Size.Empty);
faces.AddRange(faceDetected);
foreach (Rectangle f in faces)
{
img.Draw(f, new Bgr(Color.Red), 2);
}
pictureBox1.Image = img.ToBitmap();
}
}
}
目前先示範到 這裡 同學加油吧 !!!! GO GO
沒有留言:
張貼留言