葡京网上娱乐场Asp.Net WebAPI核心目标解析(三)

 
 对于.NET的分布式应用开发,可以供应我们选取的艺以及框架比较多,例如webservice,.net
remoting,MSMQ,WCF等等技术。对于这些技术很多人数还非会见生,即时没有深切的垂询,但是一定听说了,每种技术还各起优势与适用范围,没有断的好坏,只有相对的相当程度。不过可惜了,今天咱们讲课的主题不是当下几乎栽技术,今天要讲解的凡ASP.NET
WebAPI。

相机主要技术点为3A算法。

   对于ASP.NET
WebAPI的优势及特性,在这边就未称了,需要动用的自就见面挑,也无欲我浪费篇幅去上课这些,这首博文主要教授ASP.NET
WebAPI中之HTTP消息的组织及处理消息之核心目标。

一经3A算法主要依靠的凡全自动对焦(AF)、自动曝光(AE)及自动白平衡(AWB)。
活动白平衡:根据光源条件调整图颜色之保真程度。

一.WebAPI的HTTP概述:

 
 有关HTTP协议的连锁内容在此处虽非做牵线,在作者前面的博文中曾经做了介绍,现在提供一下地点,因为过多的废话就是浪费时间,我哪怕聊看就首博文的读者既对HTTP协议及WebAPI都享有了解。博文地址:

http://www.cnblogs.com/pengze0902/p/5976388.html

http://www.cnblogs.com/pengze0902/p/6224792.html

http://www.cnblogs.com/pengze0902/p/6230105.html

网上经常发生像样招聘如下的选聘信息: 

   1.当.NET4.5事先的版本被,处理HTTP的基本目标:

     
(1).在客户端:System.Net.HttpWebRequest用于初始化HTTP请求,处理相关的响应; System.Net.HttpWebResponse处理HTTP响应头和数目读取的摸索。

     
(2).在劳务器端:System.Web.HttpContext,System.Web.HttpRequest,System.Web.HttpResponse类用在ASP.NET上产卵文中,代表单个请求与应。System.Net.HttpListenerContext类,提供对HTTP请求与响应对象的访。

 ———————————————- ———————————————-

   2.于.NET4.5版本中,处理HTTP的骨干目标:

     
(1).在客户端以及劳务器端使用相同的近乎。(HttpRequestMessage和HttpResponseMessage对象吃未含上下文消息,所以可以于服务器和客户端共用。)

     
(2).由于在.NET4.5丁引入了TAP(异步任务模型),所以当新的HTTP模型中,处理HTTP请求的不二法门好采取async和awit实现异步编程。(可以简单便捷之兑现异步编程)

   
我们于新老的HTTP编程模型时,会特别易之觉察于新本子的HTTP模型中,无论是编程的难度和代码编写的精简度,已经尽的频率还是挺高之。在对于Web项目的开销中,我们本着HTTP知识的了解是必需之,对于ASP.NET的HTTP处理的规律在此间就无开实际的牵线,网上也有比多之章可供应阅读和询问。

   
对于ASP.NET的HTTP处理方式的刺探,是本身当出微信公众平台时更学习的,微信公众平台供了对外访问的接口,我们的次第与服务器对微信服务器的接口进行呼吁访问,微信服务器获取HTTP请求后,返回处理结果,本地服务器获取返回结果。这样一个央-响应模式,组成一个对话。对于微信公众平台的开对许多恰巧学习.NET的人数吧有点高大(当然这是相对而言),即时开发了好频繁是类别的次序的丁(调用第三方接口的出)也未肯定好死清晰的了解这个里面的法则,笔者觉得对于如此的老三方平台的开支,其首要的骨干组成部分就是是于HTTP协议的拍卖,建立请求、获取响应消息以及分析消息立即三异常步子,返回的信内容类同也json或者xml,获取响应消息继,主要是对准信息内容的反序列化,获得消息之实业信息,进而于次中更是处理。

   
在WeAPI中信息的发出及分析,以及信息之格式都是得动态的创建及商谈,下面我们越的询问实现就同样进程的为主目标。

Camera/ISP 算法工程师
摄影机3A算法软件工程师 

二.WebAPI的HTTP消息分析:

     
HTTP协议的劳作措施是以客户端和服务器之间交换请求和响应消息,那么这为就算好说明HTTP的核心就是信息,对于“消息”的刺探,我们只要掌握消息分为“消息头部”和“消息内容”,我们对接下去的指向新HTTP编程模型的牵线的中心就是“消息头部”和“消息内容”。

     
在命名空间System.Net.Http中,具有两个着力目标:HttpRequestMessage和HttpResponseMessage。两只目标的组织要下图:

葡京网上娱乐场 1

     
以上要教授了HttpRequestMessage对象以及HttpResponseMessage对象涵盖的重要性内容,请求和应消息都得以涵盖一个可选的消息正文,两遭遇信息类型及消息内容,都可行使应的标头。接下来具体了解有信息之布局。

此地随机摘录部分具体求。

    1.HttpRequestMessage目标解析:

         (1).HttpRequestMessage主要性能与办法概述:

名称 说明
Version 获取或设置 HTTP 消息版本
Content 获取或设置 HTTP 消息的内容
Method 获取或设置 HTTP 请求信息使用的 HTTP 方法
RequestUri 获取或设置 HTTP 请求的 Uri
Headers 获取 HTTP 请求标头的集合
Properties 获取 HTTP 请求的属性集
ToString 返回表示当前对象的字符串

        该目标要用于表示 HTTP
请求消息。对于拖欠目标的这些性和方式,大部分应当都非见面生,因为一个HTTP消息遭到重要涵盖头部、消息内容等等,在这边要介绍一个特性Properties,该属性并无属另外正规的HTTP消息,当消息传时,不会见保留该属性。

         (2).Properties属性解析:

[__DynamicallyInvokable]
public IDictionary<string, object> Properties
{
    [__DynamicallyInvokable]
    get
    {
        if (this.properties == null)
        {
            this.properties = new Dictionary<string, object>();
        }
        return this.properties;
    }
}

   
有上述之代码可以死鲜明的见到该属性只发一个只是读属性,并返一个IDictionary<string,
object>。当消息在服务器或者客户端本地开展拍卖时,该属性用于保存附加的信信息。该属性只是一个通用的器皿,保存本地信息属性。(与受信息的连年相关的客户端认证;将消息及部署路由于进行匹配,得到的路由数据)

供职要求:
1、本科以上学历,天文,物理,机电、工业自动化,电子相关专业,硕士学历优先考虑;
2、本科毕业3年以上,硕士毕业1年以上之连带行业相关工作经验要求;
3、熟练掌握C/C++或者FPGA 开发语言,数据结构,MATLAB,信号与系统;
4、掌握数字色度学,数字图像处理,数字影像处理的基本知识;
5、熟悉摄影机成像原理;
6、掌握3A(AF,AE,AWB)算法有;
7、对于自动化控制,数字信号采样,滤波,负反馈,PID算法有实际经历;
8、理解从镜头及SENSOR,电机,ISP,编码器,采集,显示通道有排变化。

   2.HttpResponseMessage靶解析:

        (1).HttpRequestMessage主要性能与章程概述:

名称 说明
EnsureSuccessStatusCode 如果 HTTP 响应的 IsSuccessStatusCode 属性为  false, 将引发异常
StatusCode 获取或设置 HTTP 响应的状态代码
ReasonPhrase 获取或设置服务器与状态代码通常一起发送的原因短语
RequestMessage 获取或设置导致此响应消息的请求消息
IsSuccessStatusCode 获取一个值,该值指示 HTTP 响应是否成功

     
对于拖欠目标的局部性没有列举,因为当HttpRequestMessage对象就介绍,如:Version、Content、Headers等,该目标主要用于表示
HTTP 响应消息。在此最主要介绍StatusCode属性。

       (2).StatusCode属性:

[__DynamicallyInvokable]
public HttpStatusCode StatusCode
{
    [__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    get
    {
        return this.statusCode;
    }
    [__DynamicallyInvokable]
    set
    {
        if ((value < ((HttpStatusCode) 0)) || (value > ((HttpStatusCode) 0x3e7)))
        {
            throw new ArgumentOutOfRangeException("value");
        }
        this.CheckDisposed();
        this.statusCode = value;
    }
}

   
 StatusCode属性为枚举属性,该属性可读而写,对于状态码这个定义,很多人数犹是于了解之,在HTTP协议被,状态码主要是意味于信息的要于服务器被处理的结果,状态产生2XX,3XX,4XX,5XX等等,具体表示的意思就是不再描述。

任职要求:

     3.HTTP模子消息标头解析:

         
在HTTP中,请求与应消息,以及消息内容我,都可采取称为标头的额外字段,包含重复多之音讯。

       (1).标头分类:

标头名称 描述 HTTP模型标头容器类
User-Agent 为请求提供扩展信息,描述产生这个请求的应用程序 HttpRequestHeaders
Server 为响应提供关于源服务器软件的扩展信息 HttpResponseHeaders
Content-Type 定义请求或响应有效载荷正文中,资源表示使用的媒体类型 HttpContentHeaders

       (2).HttpHeaders抽象类分析:

名称 描述
Add 添加指定的标头及其值到 HttpHeaders 集合中。
TryAddWithoutValidation 返回一个值,该值指示指定标头及其值是否已添加到HttpHeaders 集合,而未验证所提供的信息。
Clear 从 HttpHeaders 集合中移除所有标头。
Remove 从HttpHeaders集合中移除指定的标头。
GetValues 返回存储在HttpHeaders 集合中所有指定标头的标头值。
Contains 如果指定标头存在于 HttpHeaders 集合则返回。
ToString 返回表示当前 HttpHeaders对象的字符串。

     
 HttpHeaders是一个抽象类,HttpRequestHeaders、HttpResponseHeaders、HttpContentHeaders三单近乎继承了此类。接下来我们来询问一下Add()方法:

[__DynamicallyInvokable]
public void Add(string name, string value)
{
    HeaderStoreItemInfo info;
    bool flag;
    this.CheckHeaderName(name);
    this.PrepareHeaderInfoForAdd(name, out info, out flag);
    this.ParseAndAddValue(name, info, value);
    if (flag && (info.ParsedValue != null))
    {
        this.AddHeaderToStore(name, info);
    }
}

     
 Add()方法有两独重载版本,该方法可以于容器添加标头,如果只要添加的标头有标准名,在添加前标头值会展开认证。Add方法还会证明标头是否足以生出差不多独价值。

  1. 通camera的3A(AE,AWB,AF)算法原理同筹划思路,
    有3A算法的筹划更也佳
  2. 备丰富ISP(图象处理器) 开发经历,熟悉MTK,QUALCOMM,
    OV等便携式终端上使之ISP开发条件。有上述条件下开经历也完美无缺。
  3. 精通数字图像处理原理同基础知识。
  4. 习C/C++语言,有出经历也佳
  5. 起手机/便携式相机3A算法实现/应用经验
  6. 精通CMOS sensor的做事原理

   4.HTTP音内容分析:

     
在.NET4.5版的HTTP模型中,HTTP消息的正文由抽象基类HttpContent表示,HttpResponseMessage和HttpRequestMessage对象还富含一个HttpContent类型的Content属性。

     (1).HttpContent主要性能与方式:

名称 描述
ReadAsByteArrayAsync 以异步操作将 HTTP 内容写入字节数组。
SerializeToStreamAsync 以异步操作将 HTTP 内容序列化到流。
CopyToAsync 以异步操作将 HTTP 内容写入流。
LoadIntoBufferAsync 以异步操作将 HTTP 内容序列化到内存缓冲区。
CreateContentReadStreamAsync 以异步操作将 HTTP 内容写入内存流。
TryComputeLength 确定 HTTP 内容是否具备有效的字节长度。
Headers 根据 RFC 2616 中的定义,获取内容标头。

     (2).CopyToAsync()方法分析:

[__DynamicallyInvokable]
public Task CopyToAsync(Stream stream, TransportContext context)
{
    Action<Task> continuation = null;
    this.CheckDisposed();
    if (stream == null)
    {
        throw new ArgumentNullException("stream");
    }
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
    try
    {
        Task task = null;
        if (this.IsBuffered)
        {
            task = Task.Factory.FromAsync<byte[], int, int>(new Func<byte[], int, int, 
            AsyncCallback, object, IAsyncResult>(stream.BeginWrite), new Action<IAsyncResult>(stream.EndWrite), 
       this.bufferedContent.GetBuffer(), 0, (int) this.bufferedContent.Length, null);
        }
        else
        {
            task = this.SerializeToStreamAsync(stream, context);
            this.CheckTaskNotNull(task);
        }
        if (continuation == null)
        {
            continuation = delegate (Task copyTask) {
                if (copyTask.IsFaulted)
                {
                    tcs.TrySetException(GetStreamCopyException(copyTask.Exception.GetBaseException()));
                }
                else if (copyTask.IsCanceled)
                {
                    tcs.TrySetCanceled();
                }
                else
                {
                    tcs.TrySetResult(null);
                }
            };
        }
        task.ContinueWithStandard(continuation);
    }
    catch (IOException exception)
    {
        tcs.TrySetException(GetStreamCopyException(exception));
    }
    catch (ObjectDisposedException exception2)
    {
        tcs.TrySetException(GetStreamCopyException(exception2));
    }
    return tcs.Task;
}

   
在采取信息内容经常,需要利用HtppContent的法子要扩展方法。在HttpContent中采用CopyToAsync()方法为推送方式访原本之音内容,由方代码可以看到,该法接受两单参数,一个是流动对象,一个凡是关于传输的信(例如,通道绑定),此参数可以吧
null。该措施好将信息内容写副到是流中。

    在该措施的落实代码中
创建了一个TaskCompletionSource<object>的泛型对象,该对象表示不绑定到委托的 Task<TResult> 的制造者方,并由此 Task 属性提供针对性使用者正在的拜会。SerializeToStreamAsync方法将盛传的流对象序列化,该措施为异步方法。

   
我们用专注的几沾,主要为委托的创建同动用,在C#遭受,尽量使用有.NET提供的委托类,不要自己失去创造。还有少数就是是以次中针对特别的处理方式,异常的捕获具有层次性,并且调用了自定义的一个很处理办法TrySetException。

    (2).ReadAsStreamAsync()方法分析:

     
在博旧消息内容时,除了调用上面介绍的方外,还得调用ReadAsStreamAsync()方法以拉取的道访原本之音讯内容。

     
在HttpContent中涵盖有另外两单近乎的法子,ReadAsStringAsync()和ReadAsByteArrayAsync()异步的提供信息内容之缓冲副本,ReadAsByteArrayAsync()返回原的字节内容,ReadAsStringAsync()将内容解码为字符串返回。

 ———————————————- ———————————————-

三.DotNet中初老HTTP模型分析:

设若立看似职位一般还是高薪待遇。 

   1..NET4.5事先版本创建HTTP POST请求实例:

        public static string HttpPost(string postUrl, string postData)
        {
            if (string.IsNullOrEmpty(postUrl))
                throw new ArgumentNullException(postUrl);
            if (string.IsNullOrEmpty(postData))
                throw new ArgumentNullException(postData);
            var request = WebRequest.Create(postUrl) as HttpWebRequest;
            if (request == null)
                throw new ArgumentNullException("postUrl");
            try
            {
                var cookieContainer = new CookieContainer();
                request.CookieContainer = cookieContainer;
                request.AllowAutoRedirect = true;
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                var data = Encoding.UTF8.GetBytes(postData);
                request.ContentLength = data.Length;
                var outstream = request.GetRequestStream();
                outstream.Write(data, 0, data.Length);
                outstream.Close();
                //发送请求并获取相应回应数据,获取对应HTTP请求的响应
                var response = request.GetResponse() as HttpWebResponse;
                if (response != null)
                {
                    var instream = response.GetResponseStream();
                    var content = string.Empty;
                    if (instream == null)
                    {
                        return content;
                    }
                    using (var sr = new StreamReader(instream, Encoding.UTF8))
                    {
                        content = sr.ReadToEnd();
                    }
                    return content;
                }
            }
            catch (ArgumentException arex)
            {
                throw arex;
            }
            catch (IOException ioex)
            {
                throw ioex;
            }
            return null;
        }

下一场问题来了,市面上3A算法相关材料还死稀少,就连相关书籍都非常少提及算法细节,而她们多还见面要求精通3A算法至少有。

   2..NET4.5版本创建HTTP POST请求实例:

async static void getResponse(string url)
        {
            using (HttpClient client = new HttpClient())
            {
                using (HttpResponseMessage response = await client.GetAsync(url))
                {
                    using (HttpContent content = response.Content)
                    {
                        string myContent = await content.ReadAsStringAsync();
                    }
                }
            }
        }
        async static void postResponse(string url)
        {
            while (true)
            {
                IEnumerable<KeyValuePair<string, string>> queries = new List<KeyValuePair<string, string>>()
            {
                new KeyValuePair<string, string> ("test","test")
            };
                HttpContent q = new FormUrlEncodedContent(queries);
                using (HttpClient client = new HttpClient())
                {
                    using (HttpResponseMessage response = await client.PostAsync(url, q))
                    {
                        using (HttpContent content = response.Content)
                        {
                            string myContent = await content.ReadAsStringAsync();

                            Console.WriteLine(myContent);
                        }
                    }
                }
            }
        }

倘至于白平衡算法,比较科学的材料是当时卖:

四.总结:

 
 以上要讲解了.NET4.5前与后版本对HTTP编程模式之有内容, 两者的第一分在于.NET4.5本子之前的HTTP编程模型会区分客户端和服务器,两者采用的目标存在不同,实现之原理及则有必然的相似性,但是利用的近乎可不同。.NET4.5过后的本子中,对象的使用没有客户端以及服务器的分,两者可以共用。

基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的法则、实现与职能

前面反复同博主laviewpbt探讨相关的知识,受益匪浅。

只要据我所知,绝大多数之照相机采用的底蕴算法就是灰度世界算法,然后在马上算法的根基及更改善。

贴一下《因灰度世界、完美反射、动态阈值等图像自动白平衡算法的规律、实现和效益》灰度世界法的大概内容。

 ———————————————- ———————————————-

灰度世界算法(Gray World)

  是以灰度世界要为底蕴之,该要认为于一幅有所大量色彩变化之图像,
R、 G、 B 三只轻重的平均值趋于同一个灰度K。一般生零星种方式来规定该灰度。

(1)直接吃一定为固定值, 取其每通道极其可怜价值的一半,即取为127或者128;

(2)令 K = (Raver+Gaver+Baver)/3,其中Raver,Gaver,Baver分别代表红、 绿、
蓝三独通道的平均值。

算法的次步是个别计算各国通道的增益:

Kr=K/Raver;

Kg=K/Gaver;

Kb=K/Baver;

算法第三步为依据Von Kries
对角模型,对于图像遭到之每个像素R、G、B,计算其结果值:

Rnew = R * Kr;

Gnew = G * Kg;

Bnew = B * Kb;

于上式,计算着或者会见是溢出(>255,不会见产出小于0的)现象,处理方式有星星点点种。

a、 直接以诸如从设置也255,这也许会见导致图像整体偏白。

b、
计算有所Rnew、Gnew、Bnew的太深价值,然后使该绝酷价值将以计后数再度线性映射到[0,255]内。实践证明这种方式将见面如图像整体偏暗,建议下第一种方案。

 ———————————————- ———————————————-

算法的大概思路就是是评估一布置图纸RGB三独通道的着极其能表达该通道富含信息之价值,然后因该值为标准重新调整像从。

然即便会见是评估不足够标准的题材,导致各通道像从信息差距过大,形成噪点以及偏色等景象。

以要使用取最好深价值的方案虽会促成在特定情景明显不均匀,例如该通道大多数底值落在极端小值周围,而倒存在一个遥远处的卓绝深价值,那么即使见面招致像从信息差距过十分,就够呛不好了。

从而当其次栽思路上进展进一步改进比较妥善,因为可用的消息于多,不便于出问题。

老二栽思路,最简便易行的其余一样种改进就是利用灰度法。

均值法: K = (Raver+Gaver+Baver)/3 

我们领略常用之视频采访编码是YUV。

YUV相关见百度百科:YUV

其中的Y为:

Y =0.299*R + 0.587*G+0.114*B

故灰度法相应可对诺为:

K=0.299*Raver + 0.587*Gaver+0.114*Baver

经过实测,这样的拍卖后效果还不易。

贴上对比图:

葡京网上娱乐场 2

原图

葡京网上娱乐场 3

均值法

葡京网上娱乐场 4

灰度法

只是从眼睛上去分辨两摆图,的确颇麻烦分来优劣。

可自己呢只是大概点一下是思路而已,有所积攒之人,看到就,应该可以分散出双重多之想法。

连片下自己要是说的凡切实相机中之钨丝灯等手动白平衡是哪些实现之。

大概的游说即使是色温调节。

这就是说根据灰度世界是白平衡算法可以怎么落实这种调节也?!

此贴有简约实现的C代码:

switch (preset)
    {
    case AUTO: 
        Raver = (SumR / numberOfPixels);
        Gaver = (SumG / numberOfPixels);
        Baver = (SumB / numberOfPixels);
        break;
    case CLOUDY: 
        Raver = (SumR *1.953125 / numberOfPixels);
        Gaver = (SumG*1.0390625 / numberOfPixels);
        Baver = (SumB / numberOfPixels);
        break;
    case DAYLIGHT: 
        Raver = (SumR *1.2734375 / numberOfPixels);
        Gaver = (SumG / numberOfPixels);
        Baver = (SumB*1.0625 / numberOfPixels);
        break;
    case INCANDESCENCE: 
        Raver = (SumR *1.2890625 / numberOfPixels);
        Gaver = (SumG / numberOfPixels);
        Baver = (SumB*1.0625 / numberOfPixels);
        break;
    case FLUORESCENT: 
        Raver = (SumR *1.1875 / numberOfPixels);
        Gaver = (SumG / numberOfPixels);
        Baver = (SumB*1.3125 / numberOfPixels);
        break; 
    case TUNGSTEN:
        Raver = (SumR / numberOfPixels);
        Gaver = (SumG*1.0078125 / numberOfPixels);
        Baver = (SumB*1.28125 / numberOfPixels);
        break;
    default:
        break;
    } 

  

enum WB_PRESET{
    //自动白平衡
    AUTO,
    //阴天 7500k
    CLOUDY,
    //日光 6500k 
    DAYLIGHT,
    //白热光 5000k 
    INCANDESCENCE,
    //日光灯 4400k
    FLUORESCENT,
    //钨丝灯 2800k 
    TUNGSTEN,
};

 

葡京网上娱乐场 5

阴天

葡京网上娱乐场 6

日光

葡京网上娱乐场 7

白热光

葡京网上娱乐场 8

日光灯

葡京网上娱乐场 9

钨丝灯

这边仅是从至一个演示作用,具体的参数,可依实际上要求酌情进行修改。

正文只是抛砖引玉一下,若发生另外连锁问题还是要求也堪邮件联系自身探讨。

 邮箱地址是:

gaozhihan@vip.qq.com