c# 练手案例,2DImage图片处理

c# OpenCvSharp图像裁剪、调整大小、旋转、透视(三) 图像裁剪、调整大小、旋转、透视图像处理基本操作。 阅读详情

案例所涉及到的内容:文件读取,写入。图片的形变,切割,缝合。

项目的流程如下:

1.检索文件

2.修改图片的尺寸比例成3:2

3.按3:2比例分割图片成一块块正方形

4.批量修改名字

5.按顺序名字把子图片合并完整的一张图

 

 

namespace ImageTool
{
    class Program
    {
        private static string _fileNameWithoutExtension; //文件名
        private static string _fileExtension;//扩展名
        private static string _fileDirectory;//所属文件夹
        private static string _targetImagePath = null;//分割图片所属的文件路径
        private static string _imageSuffix; //设置图片后缀格式

        public static class Data
        {
            public const string jpg = ".jpg";
            public const string bmg = ".bmg";
            public const string png = ".png";
            public const string tiff = ".tiff";

            public const string sprit = "\\";

            private static string image = null;

            public static string Image
            {
                get
                {
                    if (image == null)
                    {
                        return image = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000).ToString();
                    }
                    else
                    {
                        return image;
                    }

                }
            }

        }


        enum StatusMessage
        {
            Null,
            Move,
            Unusual
        }

        static void MessageHandling(StatusMessage SM)
        {
            switch (SM)
            {
                case StatusMessage.Null:
                    Console.WriteLine("程序未启动...");
                    break;
                case StatusMessage.Move:
                    Console.WriteLine("程序运行中...");
                    break;
                case StatusMessage.Unusual:
                    Console.WriteLine("出现异常...");
                    return;
            }
        }

        public Program() { }

        static void Main()
        {
            Program program = new Program();

            Console.WriteLine("输入修改图片的地址...");
            var inputImgPath = Console.ReadLine();

            string[] suffix = { ".exe" };
            ArrayList Lists = FileSearch(inputImgPath, suffix);
            Console.WriteLine("\n" + "检索到的文件列表如下: ");
            if (Lists.Count == 0) {

                Console.WriteLine("文件列表为null");
            }
            for (int i = 0; i < Lists.Count; i++)
            {
                Console.WriteLine("files[" + i + "]: "+Lists[i].ToString());
            }
            for (int i = 0; i < Lists.Count; i++)
            {
                if (File.Exists(Lists[i].ToString()))
                {
                    _fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(Lists[i].ToString());
                    _fileExtension = System.IO.Path.GetExtension(Lists[i].ToString());
                    _fileDirectory = System.IO.Path.GetDirectoryName(Lists[i].ToString());

                }
                else
                {
                    Console.WriteLine("文件不存在...");
                    MessageHandling(StatusMessage.Unusual);
                    return;
                }
                Console.WriteLine("\n#####################################################################");
                Console.WriteLine("开始对文件:[--“" + Lists[i].ToString() + "”--]进行处理####");
                var inputChangImgPath = _fileDirectory + Data.sprit + Data.Image;
                string ChangImgPath = program.ChangImageSize(inputChangImgPath, Data.jpg);
                program.CroppingToScale(ChangImgPath, Program._imageSuffix,false);
                program.ChangeFilesName(_targetImagePath);
                program.CombineImages(_targetImagePath, _targetImagePath + Data.sprit + Data.Image +"_"+ _fileNameWithoutExtension, Program._imageSuffix);
                initialise();
            }

            System.Diagnostics.Process.Start(inputImgPath);//处理完成后打开相应的文件夹
            Console.WriteLine("\n" + "---输入回车键退出程序---");
            Console.ReadLine();

        }

        public static void initialise() {

            _fileNameWithoutExtension = null;
            _fileExtension = null;
            _fileDirectory = null;
            _targetImagePath = null;
            _imageSuffix = null;

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="path">路径</param>
        /// <param name="exception">排除文件名</param>
        /// <returns></returns>
        public static ArrayList FileSearch(string path, string[] exception)
        {
            if (!Directory.Exists(path))
            {
                Console.WriteLine("不存在文件...");
                return null;
            }

            int j = 0;
            ArrayList mItem = new ArrayList();
            DirectoryInfo search = new DirectoryInfo(path);
            FileSystemInfo[] fsinfos = search.GetFileSystemInfos();

            foreach (FileSystemInfo fsinfo in fsinfos)
            {
                if (!(fsinfo is DirectoryInfo))
                {
                    for (int i = 0; i < exception.Length; i++)
                    {
                        if (fsinfo.Name.Contains(exception[i]) == false)
                        {
                            mItem.Add(fsinfo.FullName);
                            j++;
                        }
                    }

                }
                else
                {
                    //这个用于检索当前文件夹下包含的所有子文件夹
                    //DirectoryInfo dtinfo = new DirectoryInfo(fsinfo.FullName);
                    //FileInfo[] f = dtinfo.GetFiles();
                    //foreach (FileInfo file in f)
                    //{
                    //    for (int i = 0; i < exception.Length; i++)
                    //    {
                    //        if (file.Name.Contains(exception[i]) == false)
                    //        {

                    //            mItem.Add(file.FullName);
                    //            j++;
                    //        }
                    //    }
                    //}

                }
            }

            return mItem;
        }

        /// <summary>
        /// 修正图片比例,更改为3:2比例
        /// </summary>
        /// <param name="destPath">修正后图片生成地址</param>
        /// <param name="imageSuffix">图片格式</param>
        /// <returns></returns>
        public string ChangImageSize(string destPath, string imageSuffix = Data.png)
        {
            var srcPath = _fileDirectory + Data.sprit + _fileNameWithoutExtension + _fileExtension;
            Program._imageSuffix = imageSuffix;
            try
            {
                Image inputImg = Image.FromFile(srcPath);
                Console.WriteLine("\n" + "修正图片尺寸");
                int imgWidth = inputImg.Width;
                int imgHeight = inputImg.Height;

                if (imgWidth < imgHeight)
                {
                    Console.WriteLine("当前图像“imgWidth < imgHeight”,旋转为水平方向");
                    int heightAfter = (int)Math.Ceiling(imgHeight * 1.00);
                    int widthAfter = (int)Math.Ceiling(((heightAfter * 2) / 3) * 1.00);
                    int OffsetWidth = Math.Abs((widthAfter - imgWidth) / 2);

                    Bitmap newBmp = new Bitmap(heightAfter, widthAfter, PixelFormat.Format24bppRgb);
                    Graphics newBmpGraphics = Graphics.FromImage(newBmp);
                    newBmpGraphics.Clear(SystemColors.AppWorkspace);

                    Rectangle rect = new Rectangle(0, 0, imgHeight, imgWidth);
                    Rectangle rectangle = new Rectangle(0, OffsetWidth, imgHeight, imgWidth);
                    rectangle.Inflate(0, OffsetWidth);
                    inputImg.RotateFlip(RotateFlipType.Rotate90FlipNone);//图片旋转,与画布Graphics无关
                    newBmpGraphics.DrawImage(inputImg, rectangle, rect, GraphicsUnit.Pixel);
                    newBmpGraphics.Save();

                    var ChangFinishImagePath = destPath + _fileNameWithoutExtension + imageSuffix;
                    BitMapSave(newBmp, ChangFinishImagePath);

                    inputImg.Dispose();
                    newBmp.Dispose();
                    newBmpGraphics.Dispose();

                    Console.WriteLine("修正成功,图片地址另存为: " + ChangFinishImagePath);
                    return ChangFinishImagePath;

                }else{

                    int widthAfter = (int)Math.Ceiling(imgWidth * 1.00);
                    int heightAfter = (int)Math.Ceiling(((widthAfter * 2) / 3) * 1.00);
                    int OffsetHeight = Math.Abs((heightAfter - imgHeight) / 2);

                    Bitmap newBmp = new Bitmap(widthAfter, heightAfter, PixelFormat.Format24bppRgb);
                    Graphics newBmpGraphics = Graphics.FromImage(newBmp);
                    newBmpGraphics.Clear(SystemColors.AppWorkspace);

                    Rectangle rect = new Rectangle(0, 0, imgWidth, imgHeight);
                    Rectangle rectangle = new Rectangle(0, OffsetHeight, imgWidth, imgHeight);
                    rectangle.Inflate(0, OffsetHeight);                   
                    newBmpGraphics.DrawImage(inputImg, rectangle, rect, GraphicsUnit.Pixel);
                    newBmpGraphics.Save();

                    var ChangFinishImagePath = destPath + _fileNameWithoutExtension + imageSuffix;
                    BitMapSave(newBmp, ChangFinishImagePath);

                    inputImg.Dispose();
                    newBmp.Dispose();
                    newBmpGraphics.Dispose();

                    Console.WriteLine("修正成功,图片地址为: " + ChangFinishImagePath);
                    return ChangFinishImagePath;
                }
            }
            catch (OutOfMemoryException e)
            {
                Console.WriteLine("该文件没有有效的图像格式", e);
                MessageHandling(StatusMessage.Unusual);
                return null;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                MessageHandling(StatusMessage.Unusual);
                return null;
            }

        }

        /// <summary>
        /// 按比例分割图片
        /// </summary>
        /// <param name="inputImgPath">导入地址</param>
        /// <param name="imageSuffix">图片格式</param>
        /// <param name="Bool">是否删除源文件</param>
        /// <returns></returns>
        public string CroppingToScale(string inputImgPath, string imageSuffix = Data.png, bool Bool = true)
        {

            if (!File.Exists(inputImgPath))
            {
                Console.WriteLine("修正后的图片找不到,文件不存在...");
                MessageHandling(StatusMessage.Unusual);
                return null;
            }
           
            // 装载要分隔的图片 
            Image inputImg = Image.FromFile(inputImgPath);

            int imgWidth = inputImg.Width;
            int imgHeight = inputImg.Height;
            int cropWidth = imgWidth / 3;
            int cropHeigth = imgHeight / 2;

            //---------------------------------------------------------------------- 
            ArrayList areaList = new ArrayList();

            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            sb.Append("<table cellpadding='0' cellspacing='0' border='[$border]'>");
            sb.Append(System.Environment.NewLine);

            int i = 0;
            int pointY = 0;
            for (int iHeight = 0; iHeight < 2; iHeight++)
            {
                int pointX = 0;
                sb.Append("<tr>");
                sb.Append(System.Environment.NewLine);
                for (int iWidth = 0; iWidth < 3; iWidth++)
                {
                    string fileName = string.Format("<img src='http://localhost/File/{0}_{1}{2}'  />", _fileNameWithoutExtension, i, imageSuffix);
                    sb.Append("<td>" + fileName + "</td>");
                    sb.Append(System.Environment.NewLine);
                    string s = string.Format("{0};{1};{2};{3}", pointX, pointY, cropWidth, cropHeigth);

                    Rectangle rect = new Rectangle(pointX, pointY, cropWidth, cropHeigth);
                    areaList.Add(rect);
                    pointX += cropWidth;
                    i++;
                }
                pointY += cropHeigth;
                sb.Append("</tr>");
                sb.Append(System.Environment.NewLine);
            }

            sb.Append("</table>");

            Console.WriteLine("\n" + "检测是否存在子文件夹...");

            string fileSonName = System.IO.Path.GetDirectoryName(inputImgPath) + Data.sprit + Data.Image + Data.sprit + _fileNameWithoutExtension;
            _targetImagePath = fileSonName;

            if (Directory.Exists(fileSonName) == false)
            {
                Console.WriteLine("文件夹不存在,创建中..");
                Directory.CreateDirectory(fileSonName);
            }
            else
            {
                Console.WriteLine("生成图片文件夹存在,清空已有数据..");
                DirectoryInfo dirInfo = new DirectoryInfo(fileSonName);
                FileInfo[] files = dirInfo.GetFiles();

                foreach (FileInfo file in files)
                {
                    file.Delete();
                    Console.WriteLine("删除数据的路径 : " + file.DirectoryName + Data.sprit + file.Name);
                }
                Console.WriteLine("删除完毕!!!");
            }
            Console.WriteLine("\n" + "开始切割图片...");

            for (int iLoop = 0; iLoop < areaList.Count; iLoop++)
            {
                Rectangle rect = (Rectangle)areaList[iLoop];
                string fileName = fileSonName + Data.sprit + iLoop.ToString() + imageSuffix;

                Bitmap newBmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format24bppRgb);
                Graphics newBmpGraphics = Graphics.FromImage(newBmp);
                Rectangle rectangle = new Rectangle(0, 0, rect.Width, rect.Height);
                newBmpGraphics.DrawImage(inputImg, rectangle, rect, GraphicsUnit.Pixel);

                newBmpGraphics.Save();
                BitMapSave(newBmp, fileName);

                Console.WriteLine("图片生成路径: " + fileName);
                newBmp.Dispose();
                newBmpGraphics.Dispose();
            }

            inputImg.Dispose();

            if (Bool)
            {
                File.Delete(inputImgPath);
                Console.WriteLine("\n" + "修正图已被删除(***默认处理***)...,路径: " + inputImgPath);
            }

            string html = sb.ToString();
            Console.WriteLine("\n" + "Html(表): " + "\n" + html + "\n");
            return html;
        }

        /// <summary>
        /// 修改分割文件名字
        /// </summary>
        /// <param name="folderPath"></param>
        public void ChangeFilesName(string folderPath)
        {
            if (!Directory.Exists(folderPath)) {
                MessageHandling(StatusMessage.Unusual);
                return;
            }
            var files = new DirectoryInfo(folderPath).GetFiles();
            Console.WriteLine("进行图片名字批处理..." + "\n" + "读取到的总数: " + files.Length);

            if (files.Length == 0)
            {
                Console.WriteLine("未读取到文件");
                MessageHandling(StatusMessage.Unusual);
                return;
            }
                Console.WriteLine("开始修改... " + "\n\n" + "修改后名字: ");
                int i = 0;
                //文件名字处理在此修改
                foreach (FileInfo file in files)
                {
                    //string move_test = file.DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(file.Name.Remove(file.Name.IndexOf("."))));
                    //file.MoveTo(move_test + Data.png);

                    string move = file.DirectoryName + Data.sprit + "New_image_" + file.Name;
                    file.MoveTo(move);
                    Console.WriteLine("files[" + i + "]: " + move);

                    i++;
                }
                //int i = 0;
                //while (i == files.Length)
                //{
                //    switch (i)
                //    {
                //        case 0:
                //            files[i].MoveTo(files[i].DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(files[i].Name)));                            
                //            break;
                //        case 1:                            
                //            files[i].MoveTo(files[i].DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(files[i].Name)));
                //            break;
                //        case 2:
                //            files[i].MoveTo(files[i].DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(files[i].Name)));
                //            break;
                //        case 3:
                //            files[i].MoveTo(files[i].DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(files[i].Name)));
                //            break;
                //        case 4:
                //            files[i].MoveTo(files[i].DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(files[i].Name)));
                //            break;
                //        case 5:
                //            files[i].MoveTo(files[i].DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(files[i].Name)));
                //            break;
                //    }
                //    Console.WriteLine("Newfile: " + files[i].DirectoryName + Data.sprit + "New_image_" + Math.Abs(files.Length - int.Parse(files[i].Name)));
                //    i++;
                //}
            

        }

        /// <summary>
        /// 缝合图片,根据名字顺序
        /// </summary>
        /// <param name="folderPath">导入地址</param>
        /// <param name="toPath">导出图片地址</param>
        /// <param name="imageSuffix">图片格式</param>
        private void CombineImages(string folderPath, string toPath, string imageSuffix = Data.png)
        {
            if (!Directory.Exists(folderPath))
            {
                MessageHandling(StatusMessage.Unusual);
                return;
            }
            //var files = new DirectoryInfo(folderPath).GetFiles("*" + Data.png, SearchOption.TopDirectoryOnly);//目前检索到的文件只有图片,干脆全部获取
            var files = new DirectoryInfo(folderPath).GetFiles();
            if (files.Length == 0)
            {
                Console.WriteLine("文件不存在...");
                MessageHandling(StatusMessage.Unusual);
            }
            Console.WriteLine("\n" + "进行图片缝合..." + "\n" + "处理中...Biubiubiu...");

            var imgs = files.Select<FileInfo, Image>(f => Image.FromFile(f.FullName));
            var finalWidth = imgs.Max<Image>(img => img.Width * 3);
            var finalHeight = imgs.Max<Image>(img => img.Height * 2);

            var finalImg = new Bitmap(finalWidth, finalHeight);
            Graphics g = Graphics.FromImage(finalImg);
            g.Clear(SystemColors.AppWorkspace);

            var width = 0;
            var height = 0;
            for (int i = 0; i < files.Length; i++)
            {

                Image img = Image.FromFile(files[i].FullName);
                g.DrawImage(img, width, height);
                width += img.Width;

                bool res = (i == 2) ? true : false;

                if (res)
                {
                    width = 0;
                    height += img.Height;
                }

                img.Dispose();
            }

            var finalImage = toPath + imageSuffix;
            BitMapSave(finalImg, finalImage);

            finalImg.Dispose();
            g.Dispose();

            Console.WriteLine("文件已保存,地址: " + finalImage);
            Console.WriteLine("文件:[--" + _fileNameWithoutExtension + _fileExtension + "--]处理完毕!!!!");

        }

        /// <summary>
        /// 保存BitMap
        /// </summary>
        /// <param name="bmp"></param>
        /// <param name="path">保存路径</param>
        /// <param name="imageSuffix">文件后缀</param>
        public static void BitMapSave(Bitmap bmp, string path)
        {

            switch (_imageSuffix.ToLower())
            {

                case ".bmg":
                    bmp.Save(path, ImageFormat.Bmp);
                    break;
                case ".png":
                    bmp.Save(path, ImageFormat.Png);
                    break;
                case ".jpg":
                case ".jpeg":
                    bmp.Save(path, ImageFormat.Jpeg);
                    break;
                case "gif":
                    bmp.Save(path, ImageFormat.Tiff);
                    break;
            }

        }

    }
}

 

 

 

 

 

 

C#性能真相:JIT、GC与抽象税的三重绞杀 托管语言的核心矛盾在于运行时抽象与系统性能的天然张力。C#作为典型现代托管语言,其JIT编译机制带来动态优化能力的同时,也引入不可忽视的启动延迟与CPU预热开销;垃圾回收器虽简化内存管理,却以Stop-The-World暂停和代际晋升不确定性为代价;而LINQ、async/await、字符串插值等高级语法糖,在提升开发效率的同时,实则层层叠加运行时开销——即所谓‘抽象税’。这些机制共同构成.NET应用在客户端响应、服务端延迟、基础设施确定性等关键场景下的性能瓶颈根源。本文聚焦C#真实世界性能表现,结合WPF 阅读详情

相关推荐

C++系列——Direct2D进行图片处理

图片处理工具多如牛毛了,自不必说。主要是应对需要批量处理的场景,所以不如手搓。已经试过直接用C#封装好的库,挺好的,就是过了一段时间感觉这速度有点受不了。于是转用C++,结合GDI+又手搓了一个。因为部分代码与C#版本类似(C#底层用的还是GDI),很快也搞好了。嗯~~ 这下舒服了。随着效率的提高,我以为可以快乐的摸鱼了。省下来的时间里,突然想到——有没有可能利用上GPU的性能再提高一下?于是与Direct2D偶遇了,有人说这玩意比GDI+更快,还可以利用GPU的优势。什么?

HoKis 1487

WPF编程,C#后台创建一个Image实例。

  var a = new Image { Source = new BitmapImage(new Uri("这里写存储路径", UriKind.RelativeOrAbsolute)), Width = 60, Height = 60, ...

君一席 2813

点云转二维图

点云转二维图

一位小伙偶然路过 4750

C#基础GDI绘图

GDI绘图 画笔 画笔使用Pen类表示,主要用于绘制线条,或者线条组合成的其他几何形状。 public Pen (Color color,float width) 属性 说明 Brush 获取或设置Brush,用于确定此Pen的属性 Color 获取或设置此Pen的颜色 CustomEndCap 获取或设置要在通过此Pen绘制的直线终点使用的自定义线帽 CustomStartCap 获取或设置要在通过此Pen绘制的直线起点使用的自定义线帽 DashCap 获取或设置用在短划

陆英彬 's blog 1880

学编程C#之制作一个2D游戏(愤怒的小鸟/走迷宫)来理解——基础编程和界面跳转

一、Unity创建2D项目 首先在Assets中创建文件存放素材和脚本 1.在Assets中创建文件夹(创建文件夹的方法:Assets右键→Create→Folder→重命名) Scenes存放场景 Scripts存放脚本和素材 Object存放移动物体( 小树/小鸟) 二、导入游戏背景画面到Scripts中 1.导入设计好的背景图片PNG(背景图中包含场景和要移动的主要物体) 我们要把背景图片截成一个一个的小图片 点击背景图片①SpriteMode —→Multipl..

m0_56017939的博客 2301

2.1、Image 对象介绍

Image 对象介绍

融码一生:专注 Python、C/C++、Linux、机器学习 & 深度学习、NLP、算法领域分享 578

【必备神器】C# 图片标注工具,让你的图片处理更高效

【必备神器】C# 图片标注工具,让你的图片处理更高效

寒冰屋的专栏 1191

C# gdi+简单的二维画图

实现直线,椭圆的绘图.移动 撤销返回等功能

C#底层库--Image图片操作类

本专栏为【底层库】,将介绍研发过程中 通用的函数。我们将这些固化的源码,进行重写、规范封装、单元测试、集成测试,从而形成通用化模块库,本专栏称为“底层库”。作为研发人员的你,并不需要花大量时间,完全掌握“底层库”的含义,你只需要几行调用代码,就可以解决一些项目上碰到的难题。大家有任何问题,可以评论区反馈,私信我。

花北城的博客 3966

C#实现各种二维图形绘制

可以画矩形,圆形,直线,椭圆,饼形,云线,圆弧等图形不闪烁;

【日常小结】项目Modbus RTU 协议

Modbus RTU(远程终端) 协议 一、前言 最近因为码跺宽度测量项目推广升级,更换了摄像头(换成了基恩士摄像头)和光栅(换成了施莱格05LCM系列光栅),导致原来的程序用不了了,然而这个软件升级的任务落到了我身上,作为机械非科班出身的我要学习TCP和Modbus RTU通信协议,也算是自我突破了。本文只对Modbus/RTU/HEX 进行简单的小结。 二、Modbus Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻

weixin_39681471的博客 832

C# DrawImage函数

C# DrawImage函数

webgis_kf的专栏 2万+

Vben Admin权限管理全解析:从动态菜单到按钮级控制(附代码示例)

本文全面解析Vben Admin框架的权限管理系统,从动态菜单生成到按钮级细粒度控制,提供完整的实现方案和代码示例。深入探讨基于角色-权限模型的架构设计,分享前后端协作的最佳实践,帮助开发者快速构建安全高效的企业级后台系统。

weixin_30919429的博客 487

c# 通过本地地址创建Image

c# 通过本地地址创建Image

xie__jin__cheng的博客 653

本地如何安装midscene.js运行环境

手把手教你本地安装midscene.js运行环境

实践助梦想成长 2609

26、遥感图像无监督变化检测方法解析

本文详细解析了遥感图像中的无监督变化检测方法,重点介绍了基于快速模糊 C-均值聚类的无监督变化检测方法(CDFFCM)在滑坡映射中的应用。CDFFCM 方法利用图像结构信息和高斯金字塔技术,提高了检测的准确性,减少了参数数量,并缩短了计算时间。该方法通过与传统方法的对比,展现出在高分辨率遥感图像滑坡检测中的显著优势。此外,文章还探讨了 CDFFCM 的未来发展趋势,包括技术融合、多模态数据应用以及智能化与自动化方向。

game4的博客 150

C#中的Image不能被实例化,但是方法返回一个Image是怎么回事?

https://zhidao.baidu.com/question/1509589918067394460.html

u012719076的博客 471

LeRobot — 基于 PyTorch 的真实世界机器人学习框架(一)- 核心框架模块解析

LeRobot 是一个开源的机器人学习框架,由 Hugging Face 开发,旨在降低机器人学的准入门槛。该框架提供完整的机器学习流程支持,包括数据采集、训练、评估和部署。核心模块涵盖数据集标准化、策略算法、硬件抽象和强化学习组件,采用模块化设计实现灵活扩展。通过集成 Hugging Face Hub,用户可以轻松共享数据集和预训练模型。LeRobot 特别注重真实世界的机器人应用,支持多种前沿算法如模仿学习、视觉语言动作模型等,并提供统一的硬件接口和仿真环境适配。

熊猫小妖的AI世界 171

C#实例化一个对象的方法

实例化一个对象  类名 对象名=new 类名() Teacher t= new Teacher();

Superstarimage 7504

安卓新奇玩机工具全攻略___联发科MTK v6 限时免费 刷写固件工具操作

摘要:该文介绍一款限时免费的联发科V6刷机工具,支持小米、Vivo、Moto等多品牌设备,包括红米Note14Pro等机型(Klimt/Goya等代码)。工具需注册使用,提供EFS分区备份功能。作者提示工具可能触发杀毒警报,强调禁止非法用途,并说明部分联网工具可能失效。

小马哥的专栏 1322

RK3568平台开发系列讲解(音频篇)配置声卡

📢本篇文章介绍如何配置声卡。

内核笔记 2450

记一次从Sql Server中图片二进制流还原回图片的开发过程

背景:最近在客户现场做项目上线时,需要数据迁移工作。客户之前用的一个BS桌面应用,其中关于图片的存储全部以二进制流的方式写入到Sql Server数据库表中的某个字段中,如下图所示,由于新开发应用采用文件服务器存储图片、文档等,所以就需要将表中的二进制数据还原成图片保存到文件服务器中。棘手的是原BS应用并没有提供图片下载功能以及存储前图片的MIME类型或者文件后缀,这就要求在读取图片二进制流时需要根据内容判断属于哪种类型的图片文件; 思路:首先观察一下上述图片,发现Sql Server Mana...

yu102655的专栏 2278

【Python_PySide6学习笔记(二十四)】菜单栏QMenuBar类的基本用法

此篇文章中介绍 PySide6 中 QMenuBar 类的基本用法,包括"创建菜单栏"、"创建一级菜单"、"创建二级菜单"等,会持续更新,有需要的读者可以点赞收藏,也欢迎在评论区进行讨论。

禾戊之昂的博客 1625

c#图像处理入门(-bitmap类和图像像素值获取方法)

c#图像处理入门(-bitmap类和图像像素值获取方法)

greenlandlm的博客 5911

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: transform与gameobject的联系,与Find()的关系
下一篇: Unity3D中的 Update、Lateupdate和FixedUpdate
Le_Sam
博客等级 码龄11年 342粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值