C#.net中使用Opencv
来源:互联网 发布:软件方案怎么写 编辑:程序博客网 时间:2024/05/17 22:41
前些天手头碰到一个项目,需要用到OpenCV进行图像处理。但是由于mfc做的界面实在达不到客户的要求。为了进行整合,将Opencv整合到C#开发的项目中。查询了网络,一般都说使用EmguCV,但是EmguCV的语法结构与Opencv原始C++基本上联系不大了。改写略微麻烦。放弃。继续寻找在Googlecode上看到日本人开发的OpencvSharp。基本保留了OpenCV原本的语法。改写难度不大。试了试,果然不错。
而且已经支持到目前的Opencv2.4.0,这已经十分可贵了。并给出了相当多的例子可供大家参考。马上学习了一下便能上手改写原本的Opencv程序。
现在给出我写的一个SSIM算法的C#版
using System;using System.Collections.Generic;using System.Linq;using System.Text;using OpenCvSharp;namespace OpenCvSharp.Test.Samples{ class getSSIM { public getSSIM() { IplImage img1_temp = new IplImage("./ref.png"); CvWindow w1 = new CvWindow("Image1", WindowMode.AutoSize); w1.Image=img1_temp; IplImage img2_temp = new IplImage("./jpg.jpg"); CvWindow w2 = new CvWindow("Image2", WindowMode.AutoSize); w2.Image = img2_temp; int x = img1_temp.Width; int y = img1_temp.Height; int nChan = img1_temp.NChannels; CvSize size=new CvSize(x,y); IplImage img1 = new IplImage(size, BitDepth.F32, nChan); IplImage img2 = new IplImage(size, BitDepth.F32, nChan); Cv.Convert(img1_temp, img1); Cv.Convert(img2_temp, img2); Cv.ReleaseImage(img1_temp); Cv.ReleaseImage(img2_temp); IplImage img1_sq = new IplImage(size, BitDepth.F32, nChan); IplImage img2_sq = new IplImage(size, BitDepth.F32, nChan); IplImage img1_img2 = new IplImage(size, BitDepth.F32, nChan); Cv.Pow(img1, img1_sq, 2); Cv.Pow(img2, img2_sq, 2); Cv.Mul(img1, img2, img1_img2, 1); IplImage mu1 = new IplImage(size, BitDepth.F32, nChan); IplImage mu2 = new IplImage(size, BitDepth.F32, nChan); IplImage mu1_sq = new IplImage(size, BitDepth.F32, nChan); IplImage mu2_sq = new IplImage(size, BitDepth.F32, nChan); IplImage mu1_mu2 = new IplImage(size, BitDepth.F32, nChan); IplImage sigma1_sq = new IplImage(size, BitDepth.F32, nChan); IplImage sigma2_sq = new IplImage(size, BitDepth.F32, nChan); IplImage sigma12 = new IplImage(size, BitDepth.F32, nChan); IplImage temp1 = new IplImage(size, BitDepth.F32, nChan); IplImage temp2 = new IplImage(size, BitDepth.F32, nChan); IplImage temp3 = new IplImage(size, BitDepth.F32, nChan); IplImage ssim_map = new IplImage(size, BitDepth.F32, nChan);/*************************************************************************/ Cv.Smooth(img1, mu1, SmoothType.Gaussian, 11, 11, 1.5); Cv.Smooth(img2, mu2, SmoothType.Gaussian, 11, 11, 1.5); Cv.Pow(mu1, mu1_sq, 2); Cv.Pow(mu2, mu2_sq, 2); Cv.Mul(mu1, mu2, mu1_mu2, 1); Cv.Smooth(img1_sq, sigma1_sq, SmoothType.Gaussian, 11, 11, 1.5); Cv.AddWeighted(sigma1_sq, 1, mu1_sq, -1, 0, sigma1_sq); Cv.Smooth(img2_sq, sigma2_sq, SmoothType.Gaussian, 11, 11, 1.5); Cv.AddWeighted(sigma2_sq, 1, mu2_sq, -1, 0, sigma2_sq); Cv.Smooth(img1_img2, sigma12, SmoothType.Gaussian, 11, 11, 1.5); Cv.AddWeighted(sigma12, 1, mu1_mu2, -1, 0, sigma12); double C1 = 6.5025; double C2 = 58.5225; Cv.Scale(mu1_mu2, temp1, 2); Cv.AddS(temp1, CvScalar.ScalarAll(C1), temp1); Cv.Scale(sigma12, temp2, 2); Cv.AddS(temp2, CvScalar.ScalarAll(C2), temp2); Cv.Mul(temp1, temp2, temp3, 1); Cv.Add(mu1_sq, mu2_sq, temp1); Cv.AddS(temp1, CvScalar.ScalarAll(C1), temp1); Cv.Add(sigma1_sq, sigma2_sq, temp2); Cv.AddS(temp2, CvScalar.ScalarAll(C2), temp2); Cv.Mul(temp1, temp2, temp1, 1); Cv.Div(temp3, temp1, ssim_map, 1); CvScalar index_scalar = Cv.Avg(ssim_map); Console.WriteLine(index_scalar.Val0); Console.WriteLine(index_scalar.Val1); Console.WriteLine(index_scalar.Val2); Console.WriteLine(index_scalar.Val3); Cv.ReleaseImage(img1); Cv.ReleaseImage(img2); Cv.ReleaseImage(img1_img2); Cv.ReleaseImage(img1_sq); Cv.ReleaseImage(img1_temp); Cv.ReleaseImage(mu1); Cv.ReleaseImage(mu2); Cv.ReleaseImage(mu1_sq); Cv.ReleaseImage(mu1_mu2); Cv.ReleaseImage(mu2_sq); Cv.ReleaseImage(sigma1_sq); Cv.ReleaseImage(sigma2_sq); Cv.ReleaseImage(sigma12); Cv.ReleaseImage(ssim_map); Cv.ReleaseImage(temp1); Cv.ReleaseImage(temp2); Cv.ReleaseImage(temp3); Cv.WaitKey(0); } }}
- C#.net中使用Opencv
- C#.net 环境下使用OpenCV(一)
- C#.net 环境下使用OpenCV(一)
- C#.net 环境下使用OpenCV
- C# 中使用OPenCV(Emgu)心得
- C# 中使用OPenCV(Emgu)心得
- C#.NET中使用GUID
- .NET(C#) 中使用 CsGL-OpenGL .NET
- .NET(C#) 中使用 CsGL-OpenGL .NET
- .NET(C#) 中使用 CsGL-OpenGL .NET
- C#.net 环境下使用OpenCV(一) 转
- C#.net 环境下使用OpenCV
- .Net下使用OpenCV
- .net 中使用socket (c#)
- .net(C#)中String.Format如何使用
- C#.Net中使用Crystal Report
- .net(C#)中String.Format如何使用
- .net 中使用socket (c#)
- 解决AndroidSQLite-close()wasneverexplicitlycalledondatabase异常
- 【OpenGL API】 glLineWidth
- CSS中zoom:1的作用 ,小标签大作用
- HTML中小meta
- Flash发布iOS应用全攻略(一)——如何在Flash里发布iOS应用
- C#.net中使用Opencv
- hdu 1863 畅通工程prim算法
- C++_多继承与虚基类
- 标识符的作用域--程序级>文件级>类级>函数级>块级
- 揭示宇宙奥秘的13个常数
- jQuery提升性能技巧及个人总结
- 关于DESTDIR
- POJ 1035 Spell checker
- jquery在FF下设定回车事件