想法:在影像處理run pixel上用了Parallel Foreach跟For,比非Parallel的快非常多,但是卻少了Index。在做pixel操作的時候有時需要知道要寫回哪裡。
實作:
byte[] byteArray = binary.Bytes; //size:307200
var query = byteArray.Select((val, idx) => new { Index = idx, Value = val });
int[] result = new int[byteArray.Length];
//平行 擇一上註解
Parallel.ForEach(query, b=>
{
if (b.Value >= 255)
{
result[b.Index] = -1;
}
} //close lambda expression
); //close method invocation
//非平行 擇一上註解
foreach (var b in query)
{
if (b.Value >= 255) result[b.Index] = -1;
}
結論:驚!! Parallel方法花了25ms。非Parallel花了17ms。Parallel for是否又比Parallel foreach?!
等國科會結束我再來比較一下Parallel for!!!
2013年8月17日 星期六
2013年8月16日 星期五
在WPF將RGB轉HSV調亮度後轉回RGB再SHOW圖 using Emgu CV
想法:因為系統需要由使用者動態調整亮度。
實作:
Code:
private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{ //sourceBgr&sourceHsv 事先建立
Image<Rgb, byte> rgb = sourceBgr.Clone();
Image<Hsv, byte> Hsv = sourceHsv.Clone();
CvInvoke.cvCvtColor(rgb, Hsv, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_RGB2HSV);
int newValue=(int)e.NewValue; //取得slider事件發生後的值
string s = newValue.ToString();
label1.Content = s;
if (Hsv != null)
{
for (int j = 0; j < sourceHsv.Height; j++)
{
for (int i = 0; i < sourceHsv.Width; i++)
{
byte value=0;
if (Hsv.Data[j, i, 2] + newValue > 255) value = 255;
else if (Hsv.Data[j, i, 2] + newValue < 0) value = 0;
else value = (byte)(Hsv.Data[j, i, 2] + newValue);
Hsv.Data[j, i, 2] = value;
}
}
}
CvInvoke.cvCvtColor(Hsv, rgb, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_HSV2RGB);
image1.Source = rgb.ToBitmapSource();
}
紀錄:Hsv的v(value)是亮度,只要調整它即可調整該PIXEL的亮度。
實作:
Code:
private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{ //sourceBgr&sourceHsv 事先建立
Image<Rgb, byte> rgb = sourceBgr.Clone();
Image<Hsv, byte> Hsv = sourceHsv.Clone();
CvInvoke.cvCvtColor(rgb, Hsv, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_RGB2HSV);
int newValue=(int)e.NewValue; //取得slider事件發生後的值
string s = newValue.ToString();
label1.Content = s;
if (Hsv != null)
{
for (int j = 0; j < sourceHsv.Height; j++)
{
for (int i = 0; i < sourceHsv.Width; i++)
{
byte value=0;
if (Hsv.Data[j, i, 2] + newValue > 255) value = 255;
else if (Hsv.Data[j, i, 2] + newValue < 0) value = 0;
else value = (byte)(Hsv.Data[j, i, 2] + newValue);
Hsv.Data[j, i, 2] = value;
}
}
}
CvInvoke.cvCvtColor(Hsv, rgb, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_HSV2RGB);
image1.Source = rgb.ToBitmapSource();
}
紀錄:Hsv的v(value)是亮度,只要調整它即可調整該PIXEL的亮度。
在WPF做倒數計時器
想法:因為系統需要倒數計時器來執行拍照。
實作:
step 1: 加入System.Windows.Forms參考,並引入。
step 2: coding!
private void button1_Click(object sender, RoutedEventArgs e)
{
timer1 = new Timer();//global
timer1.Interval = 1000;
second = 5;//global
timer1.Tick+=new EventHandler(timer1_Tick);
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
if (second > 0)
{
label1.Content = second ;
second--;
}
else
{
timer1.Stop();
label1.Content = "";
BitmapImage bi = new BitmapImage(new Uri("/Image/p3.jpg", UriKind.RelativeOrAbsolute));
image1.Source = bi;
}
}
Label用FontSize調字型大小。
實作:
step 1: 加入System.Windows.Forms參考,並引入。
step 2: coding!
private void button1_Click(object sender, RoutedEventArgs e)
{
timer1 = new Timer();//global
timer1.Interval = 1000;
second = 5;//global
timer1.Tick+=new EventHandler(timer1_Tick);
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
if (second > 0)
{
label1.Content = second ;
second--;
}
else
{
timer1.Stop();
label1.Content = "";
BitmapImage bi = new BitmapImage(new Uri("/Image/p3.jpg", UriKind.RelativeOrAbsolute));
image1.Source = bi;
}
}
Label用FontSize調字型大小。
2013年8月13日 星期二
EMGU CV的GPU測試運作
想法:目前系統用到emgu cv non-gpu的函式,是否改用gpu 函式效能就會提升?
實作:先run起emgu cv gpu的函式,以及針對靜態影像做簡易的影像處理。
Step1: GPU package
Step2:
針對同一張800*533影像做灰階->FastCorner->轉bitmapsouce後用元件show圖,過程皆用Image類型運算。GPU cost time 是 82ms,non-gpu cost time是 17ms。
記錄:第一台ASUS BM6650 i5-2500 3.3GHz intel內顯 品牌電腦。執行時會有unknown error,初估是非nvidia的顯卡。第二台配備nvidia quadro工作站顯卡,成功執行。
結論:gpu函式再初始階段較耗時,在簡易的影像處理函式中無法展現高效能特性,或許在更高計算量的影像處理需要時,能展現其高效能之特性,像是KinectFusion(real-time 3D reconstruction)。
實作:先run起emgu cv gpu的函式,以及針對靜態影像做簡易的影像處理。
Step1: GPU package
GPU for image processing is only available for Emgu CV rev 2.2.1 and later. Only package containing -gpu in its name (e.g.
libemgucv-xxx-gpu-xxx
) has GPU processing enabled.- Install the latest cuda graphic card driver from NVIDIA on your running platform.
- Copy the cuda and npp dll files:
cudart{bit}_{maj_rev}_{min_rev}.dll
andnpp{bit}_{maj_rev}_{min_rev}.dll
to the execution directory - Add
Emgu.CV.GPU.dll
to References - Optionally put the following lines in the top of your code to include the Emgu.CV.GPU namespace.
Step2:
針對同一張800*533影像做灰階->FastCorner->轉bitmapsouce後用元件show圖,過程皆用Image類型運算。GPU cost time 是 82ms,non-gpu cost time是 17ms。
記錄:第一台ASUS BM6650 i5-2500 3.3GHz intel內顯 品牌電腦。執行時會有unknown error,初估是非nvidia的顯卡。第二台配備nvidia quadro工作站顯卡,成功執行。
結論:gpu函式再初始階段較耗時,在簡易的影像處理函式中無法展現高效能特性,或許在更高計算量的影像處理需要時,能展現其高效能之特性,像是KinectFusion(real-time 3D reconstruction)。
訂閱:
文章 (Atom)