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