直男福利!手把手教你做一只口红色号识别器,秒变李佳琦

本文介绍了一种使用人工智能算法识别口红色号的方法,通过提取图片中的口红颜色并与数据库中的颜色进行比对,实现了对口红色号的识别。该方法涉及图像处理、颜色识别和数据库查询等技术。

bb

大数据文摘编辑组出品技术实现:宁静 七夕将至,送礼时节。直男送礼,首选口红。毕竟李佳琦一句"OMG买它”,女朋友披头散发抢购,钱包就空了一半。bb但是,口红色号千千万,选对了牌子才成功了一半。快乐橙、伤心紫,姨妈红,鸡屎绿…直男眼里没什么区别的颜色,在女生眼里各种色调、质地细微的区别都能分析一清二楚。bb那么,对于直男来说,怎么才能搞清楚如此多的口红色号呢?文摘菌耗费一毫米发际线,琢磨了一下,做出了一个口红色号识别器,希望能帮大家在七夕把深刻的革命友谊再升华一下。先来看看效果。让我们假设,七夕前夕,小姐姐发来了一张美妆博主的美照,并暗示你,“人家也喜欢这个颜色。bb图片来自网络这个时候,用我们的口红色号识别器,就能定位嘴唇,并迅速给出它的颜色隶属哪家品牌的哪个色号。bbOMG!简直比李佳琦还准确!bb



好啦,废话不多说,马上开始教学时间!

来自Github的口红色号宇宙

要想识别口红色号,先得让机器知道到底都有哪些颜色。文摘菌听柜姐介绍,红色系有:“草莓红、铁锈红、枫叶红...”,其他还有“豆沙色、吃土色、番茄色...”bb


世界观还未建立完全就要开始土崩瓦解,这看着有区别吗?“豆沙色最为百搭,橘调的番茄色比较显白...”眼前的黑不是黑,你说的红是什么红?bb还好,在万能的github上,文摘菌找到了一个宝藏数据库“口红颜色可视化”,这个数据库堪比口红的色号宇宙,不仅囊括了当前最主流品牌的各种系列色号,还很良心的在色盘上排列了出来。这个数据集是一个嵌套的字典数据结构,存为json串的形式,里面记录了每个口红品牌系列下不同口红色号的颜色id、名称、和16进制颜色值。直!男!救!星!有木有!口红色号可视化链接:

https://github.com/Ovilia/lipstick

不过看这这密密麻麻的颜色,真心佩服各大口红品牌的文案高手,是怎么样区别每一个看不出区别的颜色,并且还要分别取名字的。bb傻傻分不清的文摘菌对5个品牌的不同系列做了一下统计和色号录入,于是,剩下的就交给计算机啦。

先用番茄做个实验?

既然有了如此完备的色号数据库,那么文摘菌就有了一个讨巧的方法:要想找到合适的色号,可以直接截取颜色,然后在数据库中进行比对。这个方法非常好操作,在上唇色之前,我们不如先拿别的红色物品来练手。比如,这里有一只番茄图片。你看这个番茄它又大又圆:bb
文摘菌在其中截取了成色均匀、无高亮的矩形图片:       bb       

提取这张纯色图片的RGB值在技术上是可行的,getcolor.py代码如下:


import colorsys
import PIL.Image as Image
 
def get_dominant_color(image):
    max_score = 0.0001
    dominant_color = None
    for count,(r,g,b) in image.getcolors(image.size[0]*image.size[1]):
        # 转为HSV标准
        saturation = colorsys.rgb_to_hsv(r/255.0, g/255.0, b/255.0)[1]
        y = min(abs(r*2104+g*4130+b*802+4096+131072)>>13,235)
        y = (y-16.0)/(235-16)
 
        #忽略高亮色
        if y > 0.9:
            continue
        score = (saturation+0.1)*count
        if score > max_score:
            max_score = score
            dominant_color = (r,g,b)
    return dominant_color

为了减少误差,需要裁剪多个不同位置的图片,保存在本地的一个文件夹中,读取文件,提取颜色,求平均值,得到的番茄最终的RGB颜色,代码如下:

import os
import getcolor
from os.path import join as pjoin
from scipy import misc

def load_color(color_dir,list): 
    count = 0
    for dir in os.listdir(color_dir):  
        img_dir = pjoin(color_dir, dir)  
        image = getcolor.Image.open(img_dir)
        image = image.convert('RGB')
        get=getcolor.get_dominant_color(image)
        list.append(get)
        count = count+1
        #print(person_dir)
    #print(count)
    return count

def Mean_color(count,list):
     Mean_R=Mean_G=Mean_B=0
     for i in range(count):
        tuple=list[i]
        Mean_R+=tuple[0]
        Mean_G+=tuple[1]
        Mean_B+=tuple[2]
     MeanC=((int)(Mean_R/count),(int)(Mean_G/count),(int)(Mean_B/count))
     return Me
番茄的颜色提取到了,那么和什么做比对呢?

当然是口红的数据,文摘菌这儿用到了5个品牌,分别是圣罗兰、香奈儿可可小姐、迪奥、美宝莲、纪梵希,共17个系列,271个口红色号,数据集是一个嵌套的字典数据结构,存为json串的形式,里面记录了每个口红品牌系列下不同口红色号的颜色id、名称、和16进制颜色值,lipstick.json部分数据集展示如下:

{"brands":[{"name":"圣罗兰","series":
[{"name":"莹亮纯魅唇膏","lipsticks":
[{"color":"#D62352","id":"49","name":"撩骚"},
{"color":"#DC4B41","id":"14","name":"一见倾心"},
{"color":"#B22146","id":"05","name":"浮生若梦"},


数据集中存储的RGB颜色是16进制的字符串形式,需要将其转换成RGB值,比较两个颜色相近与否,实际上是比较RGB三个分量维度上的误差,最小的口红输出对应的品牌、系列、色号和id,代码如下:

import json
import getcolor
import numpy as np
import lipcolor

#filename = 'temp.txt'
##write the temp data to file##
def WtoFile(filename,RGB_temp):
    num=len(RGB_temp)
    with open(filename,'w') as f: 
       for i in range(num):
           s = str(RGB_temp[i]).replace('[','').replace(']','')
           f.write(s)
           f.write("\n")
           
#operate the data #
##save the brand&series&color id&color name to sum_list##
##covert the color #D62352 to RGB_array##
##caculate the RGB difference to RGB_temp and write the value to file##
def data_operate():
    with open('lipstick.json', 'r', encoding='utf-8') as f:
      ret_dic = json.load(f)
      #print(ret_dic['brands'])
      #print(type(ret_dic)) # <class 'dict'>
      #print(ret_dic['brands'][0]['name']) 
      b_num=len(ret_dic['brands'])
      #print(b_num)#brands number
    
      s_list=[]
      #series brands#
      for i in range(len(ret_dic['brands'])):
          s_num=len(ret_dic['brands'][i]['series'])
          s_list.append(s_num)
          #print("{0} has {1} series".format((ret_dic['brands'][i]['name']),(s_list[i])))
    
    
      #the lipstick color of every brands every series#
      #the first loop calculate the total color numbers
      sum=0
      for b1 in range(b_num):
          for s1 in range(s_list[b1]):
              brand_name=ret_dic['brands'][b1]['name']
              lip_name=ret_dic['brands'][b1]['series'][s1]['name']
              color_num=len(ret_dic['brands'][b1]['series'][s1]['lipsticks'])
              sum+=color_num#calculate the total color numbers
            
      #the second loop save the message to a list#
      sum_list=np.zeros((sum,4), dtype=(str,8))
      value_array=np.zeros((sum,6), dtype=int)
      i=0    
      for b2 in range(b_num):
          for s2 in range(s_list[b2]):
              brand_name=ret_dic['brands'][b2]['name']
              #print(type(brand_name))
              lip_name=ret_dic['brands'][b2]['series'][s2]['name']
              color_num=len(ret_dic['brands'][b2]['series'][s2]['lipsticks'])
              for c in range(color_num):
                    color_value=ret_dic['brands'][b2]['series'][s2]['lipsticks'][c]['color']
                    color_name=ret_dic['brands'][b2]['series'][s2]['lipsticks'][c]['name']
                    color_id=ret_dic['brands'][b2]['series'][s2]['lipsticks'][c]['id']
                    #print("{0} series {1} has {2} colors,color {3}:{4}".format(brand_name,lip_name,color_num,c+1,color_name))
                    sum_list[i][0]=brand_name
                    sum_list[i][1]=lip_name
                    sum_list[i][2]=color_id
                    sum_list[i][3]=color_name
                    #value_array[i]=value_array[i][1]
                    #convert "#D62352" to [13  6  2  3  5  2]#
                    for l in range(6):
                        temp=color_value[l+1]
                        if(temp>='A'and temp<='F'):
                           temp1=ord(temp)-ord('A')+10
                        else:
                           temp1=ord(temp)-ord('0')
                        value_array[i][l]=temp1
                    i+=1
                  
                  
    #the third loop covert value_array to RGB_array#
      RGB_array=np.zeros((sum,3), dtype=int)
      for i in range(sum):
          RGB_array[i][0]=value_array[i][0]*16+value_array[i][1]
          RGB_array[i][1]=value_array[i][2]*16+value_array[i][3]
          RGB_array[i][2]=value_array[i][4]*16+value_array[i][5]
    
      #calculate the similar and save to RGB_temp
      #RGB_temp=np.zeros((sum,1), dtype=int)
      RGB_temp=np.zeros((sum,1), dtype=float)
      for i in range(sum):
          R=RGB_array[i][0]
          G=RGB_array[i][1]
          B=RGB_array[i][2]
          RGB_temp[i]=abs(get[0]-R)+abs(get[1]*3/4-G)+abs(get[2]-B)
      RGB_temp.tolist();#covert array to list
      #print(RGB_temp)
      filename="temp.txt"
      WtoFile(filename,RGB_temp)
      #sort the RGB_temp#
      result=sorted(range(len(RGB_temp)), key=lambda k: RGB_temp[k])
      #print(result)
      #output the three max prob of the lipsticks#
      print("The first three possible lipstick brand and color id&name are as follows:")
      for i in range(3):
          idex=result[i]
          print(sum_list[idex])
      print("The first three possible lipstick brand RGB value are as follows:")
      for i in range(3):
          idex=result[i]
          R=RGB_array[idex][0]
          G=RGB_array[idex][1]
          B=RGB_array[idex][2]
          tuple=(R,G,B)
          print(tuple)


if __name__ == '__main__':
     #image = getcolor.Image.open(inputpath)
     #image = image.convert('RGB')
     #get=getcolor.get_dominant_color(image)#tuple #get=(231, 213, 211)
     list=[]
     color_dir="output"
     count=lipcolor.load_color(color_dir,list)
     get=lipcolor.Mean_color(count,list)
     print("the extracted RGB value of the color is {0}".format(get))
     #operate the data#
     data_operat
文摘菌输出了最有可能吻合番茄颜色的前三个口红的信息,在Spyder中的运行结果:
bb可以看到最有可能的三个口红品牌色号的RGB值与番茄的RGB值是非常接近的:

提取到的番茄颜色:

 bb       

'迪奥' '烈艳蓝金唇膏' '080' '微笑正红’的颜色:

bb

'圣罗兰' '纯口红' '56' '橙红织锦'的颜色:

bb

'纪梵希' '高定香榭天鹅绒唇' '325' '圣水红'的颜色:

bb

文摘菌已经眼花缭乱,三个颜色……有区别吗?以后不如准备统一叫它们,番茄色!

bb

不过,这也正说明了,刚刚的提取&对比方法可行!

既然可以识别番茄的颜色,那么,可以识别人像中的口红色号吗?进入正题!人像口红色号识别接下来,我们需要做的是输入一张人像图片,可以自动识别其中的嘴唇区域,并提取出嘴唇区域中的一部分做为颜色提取的源图像。这里就要用到CV的人脸识别了,还好Dlib库有帮助我们减轻一大部分的工作量,Dlib中有自带的68个人脸的识别器,可以得到人脸部位包括眉毛、眼睛、鼻梁、面部轮廓和嘴唇区域的具体点的位置,到这儿,文摘菌以为很轻松就可以截到嘴唇区域了,结果有点尴尬.........我们首先找到了一张小姐姐的照片:       bb      

截取到的嘴唇区域如下:

bb很明显的看到上下嘴唇黑色的区域也截取到了,这对后续的提色有影响,所以文摘菌不得不回到最初的68个检测点来思考人生。bb

圣罗兰官网#842C71口红

标记的68个人脸检测点如上图所示,而嘴唇部位是从第49个标记点开始的(数组的话,下标是48),为了尽可能的截取到均匀成色的嘴唇片段,文摘菌刚开始是想从第50个标记点对角线截取到第56个标记点,而这不可避免的会截取到上下嘴唇之间的缝隙,这儿的阴影也会影响后续的颜色提取准确度,考虑到下嘴唇比上嘴唇宽,所以文摘菌截取到下嘴唇中间的两个小正方形区域:bb bb

人脸识别和截取嘴唇区域的代码如下:

import numpy as np 
import cv2
import dlib
from PIL import Image

def crop(source,pos):

      x1=pos[2][0]
      y1=pos[2][1]
      x2=pos[1][0]
      y2=pos[1][1]
      d=abs(x2-x1)
      region = source[(int)(y1-d*0.75):y2,x1:x2]
      # save the image
      cv2.imwrite("output/Mouth1.jpg", region)
      
      x1=pos[1][0]
      y1=pos[1][1]
      x2=pos[0][0]
      y2=pos[0][1]
      d=abs(x1-x2)
      region = source[y1-d:y2,x1:x2]
      # save the image
      cv2.imwrite("output/Mouth2.jpg", region)


def detect_mouth(img,pos):
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        gray = cv2.equalizeHist(gray)
        detector = dlib.get_frontal_face_detector()
        #use the predictor 
        predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
        dets = detector(img, 1)   
        print("Number of faces detected: {}".format(len(dets)))
        for a in dets:    
           cv2.rectangle(img,(a.left(),a.top()),(a.right(),a.bottom()),(255,0,0))
        #point_list=[]#save the mouth point to point_list[]#
        #Extract 68 feature points of the face and crop the lip image#
        for index, face in enumerate(dets):
           print('face {}; left {}; top {}; right {}; bottom {}'.format(index, face.left(), face.top(), face.right(), face.bottom()))
           shape = predictor(gray, face)
           for i, pt in enumerate(shape.parts()):
            #print('Part {}: {}'.format(i, pt))
            #print(i)
             pt_pos = (pt.x, pt.y)
             if i>=48 and i<=67:
                cv2.circle(img, pt_pos, 2, (255, 0, 0), 1)
             if i>=56 and i<=58:
                #print(pt_pos)
                pos[i-56][0]=pt.x
                pos[i-56][1]=pt.y
             #cv2.circle(img, pt_pos, 2, (255, 0, 0), 1)
        return img
    
if __name__ == "__main__": 
      img = cv2.imread("test3.png")
      #copy the input image for the later crop#
      img_clone = np.copy(img)
      cv2.imwrite("input/source.jpg",img_clone)
      #save the lip position to pos array#
      pos=np.zeros((3,2), dtype=int)
      result=detect_mouth(img,pos)
      cv2.imwrite("input/source2.jpg",result)
      #crop the lip areas#
      source = cv2.imread("input/source.jpg")
      crop(source,pos)
      # show the result
      cv2.imshow('FaceDetect',result)
      cv2.waitKey(0) 
      cv2.destroyAllWindow
既然已经截取到嘴唇的小矩形图像了,接下来的工作就和前面一样了,在数据库中对比每个RGB值输出最小误差对应的口红信息,而这儿也有难到文摘菌,单纯的比对RGB分量对口红色号来说并不适用,有可能每个分量相差很小,而叠加起来的颜色和提取到的颜色并不相似,在颜色的比对上需要手动调参。几经波折,最后输出的结果还是可以接受的,上图人像中涂的口红色号,感兴趣的读者可以查下正好是下面输出排名第一的口红信息。bb

误差分析

bb
对于我们测试的图片信息,文摘菌标记了嘴唇区域的特征点,我们提取到的RGB值(156,59,103)颜色如下所示:       bb       可以看到和图片的颜色已经十分接近了,而数据集合lipstick.json中这种口红存储的16进制颜色值为#842C71,对应的颜色如下:       bb       明显看到数据集存储的颜色和实际照片的颜色是有些许误差的,而在本文算法实现过程中,又不可避免的有以下误差:
  1. 嘴唇区域截取不可避免会截取到皮肤中的一部分颜色,虽然算法已经将那种可能降到最低;
  2. 颜色提取上,虽然截取多个嘴唇图片求平均值,但是本身的提取算法还是和实际值稍有偏差;
  3. RGB颜色相似度比对的算法也不够精确;
  4. 最最重要的是,照片必须是原图,而且光线要自然,加了滤镜的图是怎么也不可能识别出来的。
以上种种,使得让计算机快速高效地识别不同的口红色号还是有困难的,原来计算机有时候也会很直男。

文末福利:实时人像口红色号预测

看到这儿,可能很多读者朋友想实时地试一下能不能让计算机判断自己的口红色号,这对于OpenCV这一强大的图形操作库来说,不是什么问题,它可以打开你的摄像头,读取每一帧的图片,结合前文提到的人脸识别代码,可以实时地截取到嘴唇区域的图片,然后交给计算机预测,从此再也不怕女朋友的灵魂拷问!bb最后,附上打开摄像头的代码,快叫女朋友过来试下吧!

#coding=utf8
import cv2
import time
print('Press Esc to exit')
imgWindow = cv2.namedWindow('FaceDetect', cv2.WINDOW_NORMAL)
import sys
import os
import dlib
import glob
import numpy
from skimage import io
def detect_face():
    capInput = cv2.VideoCapture(0)
    #nextCaptureTime = time.time()
    faces = []
    feas = [] 
    if not capInput.isOpened(): print('Capture failed because of camera')
    while 1:
        ret, img = capInput.read()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        gray = cv2.equalizeHist(gray)
        time=0
        eTime = time.time() + 0.1
        detector = dlib.get_frontal_face_detector() 
        predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
        dets = detector(gray, 1)  
        print("Number of faces detected: {}".format(len(dets)))
        for a in dets:    
           cv2.rectangle(img,(a.left(),a.top()),(a.right(),a.bottom()),(255,0,0))
        for index, face in enumerate(dets):
           print('face {}; left {}; top {}; right {}; bottom {}'.format(index, face.left(), face.top(), face.right(), face.bottom()))
           shape = predictor(gray, face)   
           for i, pt in enumerate(shape.parts()):
            #print('Part {}: {}'.format(i, pt))
             pt_pos = (pt.x, pt.y)
             cv2.circle(img, pt_pos, 2, (255, 0, 0), 1)
        cv2.imshow('FaceDetect',img)
        if cv2.waitKey(1) & 0xFF == 27: break
    capInput.release()
    cv2.destroyAllWindows()
if __name__ == "__main__": 
    detect_face()

好啦,佳期如梦,双星良夜,在这个充满爱意的日子里,定位好女神常用的口红色号,和那个她来场华丽的邂逅吧!

不说了,文摘菌去下单口红了!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31562039/viewspace-2652990/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31562039/viewspace-2652990/

内容概要:本文介绍了“快速LDP-MST”这一针对大型数据集的高效基于密度峰值的聚类方法,并提供了完整的Matlab代码实现。该方法通过构建最小生成树(MST)并融合密度峰值聚类思想,有效提升了传统算法在处理大规模、复杂分布数据时的聚类效率与准确性,尤其适用于高维与非球形簇结构的数据分析任务。文章不仅阐述了算法的核心原理与技术优势,还强调了科研过程中逻辑思维、创新意识与“借力”工具的重要性,倡导研究者善用现有资源加速科研进程。; 适合人群:具备一定编程基础,特别是熟悉Matlab语言,从事数据科学、机器学习、模式识别或相关领域的科研人员、工程师及研究生;尤其适合正在开展聚类算法研究或需要高效处理大规模数据的开发者。; 使用场景及目标:①在大规模数据集中实现高效、精确的聚类分析;②研究基于密度与图论结合的聚类算法设计原理与优化路径;③通过提供的Matlab代码快速搭建实验环境,验证算法性能,或在此基础上进行二次开发与算法改进。; 阅读建议:此资源以Matlab代码为核心支撑,建议读者结合算法理论与工程实践,按照文档结构循序渐进地学习,充分利用所提供的网盘代码与模型资源,动手运行、调试并可视化算法结果,从而深入理解快速LDP-MST算法的设计思想与实现细节,提升科研效率与创新能力。
内容概要:本文围绕考虑电动汽车灵活性的微网多时间尺度协调调度问题展开研究,提出了一种基于Matlab的代码实现方案。研究充分利用电动汽车作为移动储能单元所具有的时空灵活性,将其整合到微网能量管理系统中,构建了涵盖日前计划与实时调整两个时间尺度的协调优化调度模型。模型综合考虑了可再生能源(如光伏发电)的波动性、负荷需求化、分时电价机制以及电动汽车用户的充放电行为等多重因素,通过建立以最小化系统综合运行成本为目标的优化问题,并结合适当的约束条件,采用优化算法求解,从而实现对微网内多种分布式资源的高效协同调度。该方法有效提升了微网对可再生能源的消纳能力和系统运行的经济性与稳定性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微网、智能电网相关工作的工程技术人员。; 使用场景及目标:①用于教学与科研中深入理解微网多时间尺度调度的机制与建模方法;②为实际微网工程项目中引入电动汽车参与需求响应与调度提供理论依据和可复用的仿真工具;③支撑在能源互联网背景下开展关于需求响应、分布式能源集成及灵活性资源优化利用的前沿研究。; 阅读建议:建议读者结合提供的Matlab代码,逐步理解从问题建模、目标函数设计、约束条件设定到最终优化求解的完整流程,重点关注电动汽车灵活性建模与多时间尺度协调策略的具体实现方式。同时,可通过修改电动汽车渗透率、改充电策略或调整电价信等参数进行扩展实验,以深化对系统灵活性资源调度效果与影响因素的理解。
内容概要:本文档围绕“源网荷储”背景下的现代电力系统优化问题,重点研究基于二阶锥规划(SOCP)的主动配电网优化调度方法,并结合Matlab与Simulink平台实现仿真建模。内容涵盖高渗透率电动汽车接入对配电网承载能力的影响评估、源-网-荷-储协同优化、多时间尺度调度、分布式能源并网控制、储能管理、需求响应及电力系统稳定性分析等关键技术。文档提供了丰富的科研选题与完整的Matlab/Simulink代码实现案例,展示了SOCP在电力系统优化中的建模优势,同时延伸至机器学习、路径规划、信处理等交叉学科应用,突出数学规划与智能算法在提升系统灵活性与稳定性方面的作用。; 适合人群:适用于具备电力系统、电气工程、自动化或相关专业背景,熟悉Matlab/Simulink仿真环境,从事新能源并网、微电网优化、综合能源系统等方向研究的科研人员、研究生及工程技术人员,尤其适合正在开展高水平学术论文写作或项目开发的专业人士。; 使用场景及目标:①开展含高比例可再生能源与电动汽车接入的配电网承载能力评估与优化调度研究;②掌握基于SOCP的电力系统二阶锥松弛建模与求解方法;③学习光伏、储能、电动汽车等多元设备的协同控制与仿真建模技术;④实现源网荷储协同下的多时间尺度优化策略与Matlab代码开发;⑤拓展至机器学习、路径规划、信处理等跨学科研究方向。; 阅读建议:建议结合文档附带的网盘资源与完整代码包,按照研究主题循序渐进地实践仿真模型,重点关注SOCP建模流程、YALMIP等优化工具箱的应用,通过复现经典案例加深对电力系统优化理论与工程实现的理解,并在此基础上进行创新性扩展。
内容概要:本文围绕“基于谐波线性化的并网VSG逆器正负序阻抗模型研究”展开,结合Matlab代码与Simulink仿真实现,系统探讨了虚拟同步发电机(VSG)在并网运行条件下,尤其是在不平衡电网环境中,其正负序阻抗的建模理论与方法。研究采用谐波线性化技术对VSG这一强非线性系统进行精确的小信线性化处理,克服了传统线性化方法在处理时、非线性系统时的局限性,从而建立了能够准确反映系统动态特性的序阻抗模型。该模型为分析VSG并网系统与弱电网之间的交互稳定性提供了坚实的理论基础,并通过详细的仿真验证了所建模型的有效性与准确性,对于提升新能源并网系统的稳定运行能力具有重要意义。; 适合人群:具备电力电子、新能源并网、电力系统自动化或自动控制等相关专业背景,熟练掌握Matlab/Simulink仿真工具,从事新能源发电、微电网控制、阻抗建模与稳定性分析等方向的硕士/博士研究生、科研人员及工程技术人员。; 使用场景及目标:① 深入掌握VSG在电网电压不平衡等复杂工况下的精确建模方法;② 学习并应用谐波线性化这一先进理论解决非线性、时系统的线性化难题;③ 实现并提取VSG系统的正负序阻抗,完成扫频仿真与奈奎斯特判据分析;④ 评估并网系统的稳定性,为解决实际工程中的振荡问题提供依据,支撑高水平学术论文的撰写与科研项目的深入实施。; 阅读建议:建议读者结合文中提供的Matlab代码与Simulink仿真模型进行同步操作与验证,重点关注谐波线性化的具体实现步骤、关键参数的设置依据以及仿真结果与理论推导的一致性,通过反复调试与对比,深化对VSG系统动态行为和稳定性机理的理解。
内容概要:本文档《STK入门手册》系统介绍了AGI公司开发的Satellite Tool Kit(STK)软件的基本用法与核心功能,涵盖用户界面操作、地图窗设置、各类对象(如卫星、航天器、设施、传感器等)的创建与属性定义,以及高级分析模块如高精度轨道预测(HPOP)、长周期轨道内容概要:预测(LOP)、地形本文档为与高分辨率地图《STK入门手册》,介绍了Sat的应用。手册还详细说明了Scellite Tool Kit(STK)软件的基本用enarios的时间设置、单位法与核心功能,配置、数据库管理重点涵盖用户界面操作、地图窗设置、场景及动画演示等功能,帮助用户进行全面(Scenario)管理的卫星系统仿真、卫星及各类与分析。;对象(如航天器、设施、传感器 适合人群:适用于等)的创建与刚接触STK的新属性配置。手册手用户以及具备详细说明了STK一定经验的卫星系统分析的专业技术特性,包括人员,尤其适合从事高精度轨道预测(HPOP)、长航天、遥感、周期轨道分析(LO通信等领域工程技术人员P)、地形与高分辨率地图模块和研究人员。;、姿态模拟与指向 使用场景及目标:①用于、数据可视化等功能卫星轨道设计、,并提供了对象管理覆盖分析、通、动画设置、单位路计算、传感器配置、数据库调建模等航天用等实用操作任务仿真;指导。附录还包含术语表、文件②支持复杂空间格式说明及高级技术注释。; 适合人群:从事环境下的高精度动力学建模与可视化卫星系统分析、航天分析,提升系统设计与决策效率工程、轨道设计;③辅助等相关领域的科研人员和技术教学培训与工程项目工程师,尤其适合初学者和有一定实践,实现从基础操作到高级经验的STK用户功能的全面掌握。。; 使用; 阅读建议:建议场景及目标:①用于学习和掌握结合STK软件STK软件的基础实际操作同步学习,重点关注操作与高级分析功能;②支持各章节中的属性卫星轨道仿真、覆盖设置与操作流程分析、通路,注意手册中标计算、传感器建注的Notes、模等航天任务的规划与评估;③Hints和Warnings以避免常见错误,辅助教学培训与推荐配合官方教程工程项目中的空间态势与数据库资源深化可视化与数据分析。理解。; 阅读建议:建议结合软件实际操作同步阅读,重点关注各章节中的属性设置、投影类型选择及高级模块说明,注意手册中标注的Notes、Hints和Warnings以避免常见错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值