BS版图形系统 - OpenCV - 第6章笔记

整理使用SVM实现分类的步骤 之前SVM进行项目中待识别物体的分类,过去挺长时间结果有点生疏了,这里梳理一下。因为当初是根据《深入理解OpenCV》自动分类的例程,所以这里仍以此为例。这里只是列出了SVM使用环节的代码,而且本来就是一个小例子,其中测试集训练集的选取、特征的选择等都是最简单的考虑,真正应用,要进行更加全面的考虑。     这个例程是从传送带中找到螺母、螺钉和垫圈,使用的特征是外轮廓的长宽比和面积的大小,也就是 阅读详情


QQ: 282397369

6. 学习对象分类

对每个分离的对象进行分类
训练系统,以便能够学习必需的参数,从而决定将哪个特定标签分配给检测到的对象
机器学习的基本概念,以便对具有不同标签的图像进行分类

6.1 技术要求

6.2 机器学习概念介绍

机器学习:计算机无须明确编程就能够开展学习的能力
机器学习涉及到人工智能中的模式识别和学习理论,并且与计算统计学有关
应用:OCR、垃圾邮件过滤、搜索引擎以及数以千计的计算机视觉应用程序。
机器学习算法从输入数据中进行学习的方式:

  • 监督学习:从一组有标签的数据中学习。其目标是学习模型的参数以及能使计算机对数据和输出标签结果之间的关系进行映射的规则
  • 无监督学习
  • 强化学习
    根据结果划分:
  • 分类
  • 回归
  • 聚类
  • 密度估计
    比较流行的方法:
  • 支持向量机
  • 人工神经网络
  • 聚类
  • k-最近邻
  • 决策树
  • 深度学习

OpenCV机器学习算法

继承自StatModel类的8种算法:

  • 人工神经网络
  • 随机树
  • 期望最大化
  • k-最近邻
  • 逻辑回归
  • 朴素贝叶斯分类器
  • 支持向量机
  • 随机梯度下降SVM
    StatModel类是所有机器学习算法的基类,它提供预测和所有读写功能,对于保存和读取机器学习参数和训练数据非常重要。
    训练方法:耗时、耗资源
    基类最重要的两个函数:
  • train
bool train(const Ptr<TrainData>& trainData, int falgs = 0);
bool train(InputArray samples, int layout, INputArray responses);
Ptr<_Tp> train(const Ptr<TrainData>& data, int falgs = 0);

参数:

  • TrainData:训练数据可以从TrainData类加载或创建,该类可帮助开发人员从机器学习算法中创建和提取训练数据。

  • samples:一系列的训练阵列样本,例如采用机器学习算法所需格式的训练数据

  • layout:ROW_SAMPLE(训练样本是矩阵行)或COL_SAMPLE(训练样本是矩阵列)。

  • responses:与样本数据相关的响应向量。

  • flags:由每个方法定义的可选标志。

  • predict
    float StatModel::predict(InputArray samples, OutputArray results=noArray(), int flags = 0);
    参数:

  • samples:用于预测模型结果的输入样本可以包含任意数量的数据,无论是单个还
    是多个。

  • results:每个输入行样本的结果(由先前训练的模型的算法计算)。

  • flags:这些可选标志与模型有关。某些模型(如Boost)由SVM StatModel::RAW
    _OUTPUT标志识别,这使得该方法可以返回原始结果(总和),而不是类标签。

StatModel类为其他非常有用的方法提供接口:

  • isTrained(),如果模型是训练过的,则返回true
  • isClassifier(),如果模型是分类器,则返回true,如果是回归,则返回false
  • getVarCount()返回训练样本中的变量数
  • save(const string&filename)将模型保存在指定的文件中
  • Ptr<_Tp>load(const string&filename)从指定的文件中加载<indexentry conte
    nt=“StatModel class: Ptr load (const string & filename)”>模型,例如-Ptr
    svm=StatModel::load(“my_svm_model.xml”)
  • calcError(const Ptr&data,bool test,OutputArray resp)从测试数据计算错误,其中数据是训练数据。如果test参数为true,则该方法从测试数据子集计算错误;如果为false,则该方法计算所有训练数据的错误。resp是可选的输出结果。

6.3 计算机视觉和机器学习工作流程

具备机器学习的计算机视觉应用具有共同的基本结构,这种结构分为不同的步骤

  1. 预处理:去除光和噪声、滤波、模糊。。。

  2. 分割:提取图像中的感兴趣区域,并将每个区域隔离为感兴趣的唯一对象

  3. 特征提取:特征用于描述对象,可以是对象区域、轮廓、纹理图案、像素等

  4. 分类结果:对象的描述符[特征向量或特征集],是用于描述对象的特征,用它们来训练或预测模型。须创建一个大型的特征数据集,其中预先处理了数千个图像,在选择的训练模型函数中使用提取的特征(图像/对象的特征),如面积、大小和纵横比。在这里插入图片描述

  5. 后处理:针对输出数据进行后处理
    在这里插入图片描述

6.4 自动对象检查分类示例

步骤

  1. 对于每个图像
  • 预处理图像
  • 分割图像
  1. 对于图像中的每个对象
  • 提取特征
  • 使用相应的标签(螺母、螺钉、垫圈)将这些提取出的特征添加到训练特征向量中
  1. 创建SVM模型
  2. 使用训练特征向量训练SVM模型
  3. 预处理输入图像以便对每个被分割的对象进行分类
  4. 分割输入图像
  5. 对于检测到的每个对象
  • 提取特征
  • 用SVM预测它
  • 建模
  • 在输出图像中绘制结果

6.4.1 特征提取

不同对象可能的特征:

  • 对象的面积
  • 纵横比,即宽度除以边界矩形的高度
  • 孔的数量
  • 轮廓边数
vector<vector<float>> ExtractFeatures(Mat img, vector<int>* left = NULL, vector<int>* top = NULL) {
	vector<vector<float>> output;
	vector<vector<Point>> contours;
	Mat input = img.clone();
	vector<Vec4i> hierarchy;
	findContours(input, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
	if(contours.size() == 0)
		return output;
	RNG rng(0xFFFFFFFF);
	for(auto i = 0; i < contours.size(); ++i) {
		Mat mask = Mat::zeros(img.rows, img.cols, CV_8UC1);
		drawContours(mask, contours, i, Scalar(1), FILLED, LIN8, hierarchy, 1);
		Scalar areas_s = sum(mask);
		float area = area_s[0];
		if(area > 500) {
			RotatedRect r = minAreaRect(contours[i]);
			float width  r.size.width;
			float heigh = r.size.height;
			float ar = (width < height) ? height / width : width / height;
			vector<float> row;
			row.push_back(area, ar);
			output.push_back(row);
			if(left != NULL)	
				left->push_back((int)(r.center.x));
			if(top != NULL)
				top->push_back((int)(r.center.y));
			miw->addImage("ExtractF Features", mask * 255);
			miw->render();
			waitKey(10);
		}
	}
	return output;
}

6.4.2 训练SVM模型

用监督学习,为每个对象及其相应的标签获取一组图像。
创建模型。OpenCV使用Ptr模板类进行指针管理 Ptr svm;

void trainAndTest()
{
  vector< float > trainingData;
  vector< int > responsesData;
  vector< float > testData;
  vector< float > testResponsesData;

  int num_for_test= 20;

  // Get the nut images
  readFolderAndExtractFeatures("../data/nut/tuerca_%04d.pgm", 0, num_for_test, trainingData, responsesData, testData, testResponsesData);
  // Get and process the ring images
  readFolderAndExtractFeatures("../data/ring/arandela_%04d.pgm", 1, num_for_test, trainingData, responsesData, testData, testResponsesData);
  // get and process the screw images
  readFolderAndExtractFeatures("../data/screw/tornillo_%04d.pgm", 2, num_for_test, trainingData, responsesData, testData, testResponsesData);
  
  cout << "Num of train samples: " << responsesData.size() << endl;

  cout << "Num of test samples: " << testResponsesData.size() << endl;
  
  // Merge all data 
  Mat trainingDataMat(trainingData.size()/2, 2, CV_32FC1, &trainingData[0]);
  Mat responses(responsesData.size(), 1, CV_32SC1, &responsesData[0]);

  Mat testDataMat(testData.size()/2, 2, CV_32FC1, &testData[0]);
  Mat testResponses(testResponsesData.size(), 1, CV_32FC1, &testResponsesData[0]);
  
	Ptr<TrainData> tdata= TrainData::create(trainingDataMat, ROW_SAMPLE, responses);
	
	svm = cv::ml::SVM::create();
	svm->setType(cv::ml::SVM::C_SVC);
	svm->setNu(0.05);
	svm->setKernel(cv::ml::SVM::CHI2);
	svm->setDegree(1.0);
	svm->setGamma(2.0);
	svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
	svm->train(tdata);

  if(testResponsesData.size()>0){
    cout << "Evaluation" << endl;
    cout << "==========" << endl;
    // Test the ML Model
    Mat testPredict;
    svm->predict(testDataMat, testPredict);
    cout << "Prediction Done" << endl;
    // Error calculation
    Mat errorMat= testPredict!=testResponses;
    float error= 100.0f * countNonZero(errorMat) / testResponsesData.size();
    cout << "Error: " << error << "\%" << endl;
    // Plot training data with error label
    plotTrainData(trainingDataMat, responses, &error);

  }else{
    plotTrainData(trainingDataMat, responses);
  }
}

bool readFolderAndExtractFeatures(string folder, int label, int num_for_test, 
  vector<float> &trainingData, vector<int> &responsesData,  
  vector<float> &testData, vector<float> &testResponsesData)
{
  VideoCapture images;
  if(images.open(folder)==false){
    cout << "Can not open the folder images" << endl;
    return false;
  }
  Mat frame;
  int img_index=0;
  while( images.read(frame) ){
	//// Preprocess image
    Mat pre= preprocessImage(frame);
    // Extract features
    vector< vector<float> > features= ExtractFeatures(pre);
    for(int i=0; i< features.size(); i++){
      if(img_index >= num_for_test){
        trainingData.push_back(features[i][0]);
        trainingData.push_back(features[i][1]);
        responsesData.push_back(label);    
      }else{
        testData.push_back(features[i][0]);
        testData.push_back(features[i][1]);
        testResponsesData.push_back((float)label);    
      }
    }
    img_index++;
  }
  return true;  
}

bool readFolderAndExtractFeatures(string folder, int label, int num_for_test, 
  vector<float> &trainingData, vector<int> &responsesData,  
  vector<float> &testData, vector<float> &testResponsesData)
{
  VideoCapture images;
  if(images.open(folder)==false){
    cout << "Can not open the folder images" << endl;
    return false;
  }
  Mat frame;
  int img_index=0;
  while( images.read(frame) ){
	//// Preprocess image
    Mat pre= preprocessImage(frame);
    // Extract features
    vector< vector<float> > features= ExtractFeatures(pre);
    for(int i=0; i< features.size(); i++){
      if(img_index >= num_for_test){
        trainingData.push_back(features[i][0]);
        trainingData.push_back(features[i][1]);
        responsesData.push_back(label);    
      }else{
        testData.push_back(features[i][0]);
        testData.push_back(features[i][1]);
        testResponsesData.push_back((float)label);    
      }
    }
    img_index++;
  }
  return true;  
}

6.4.3 输入图像预测

  • 加载图像并将其转换为灰度值
  • 通过preprocessImage函数应用预处理任务
  • ExtractFeatures提取图像中出现的所有对象的向量特征和每
    个对象的左上角位置
  • 将检测到的每个对象存储为特征行,然后把每行转换为一行的Mat和两个特征
  • 用StatModel SVM的predict函数预测单个对象,预测结果是被检测的对象的标签。
  • 用stringstream存储文本,并用Scalar存储每个不同标签的颜色
  • 用在ExtractFeatures函数中检测到的位置在每个对象上绘制标签文本

6.5 总结

C++/OpenCV实现图像目标识别与分类 写在前面 这次分享的为一个很理想的情况下的目标识别与分类,对象为螺丝、螺帽、圆环这三个东西,其实就是图一乐呵,为什么说理想化呢?看一下本文使用的实验图片。 可以看到,图像中三个目标非常清楚,因为该图背景非常单一,这张图为在我床单上拍的。最近也还在补充图像处理相关的数学基础理论,要达到能在复杂背景下的目标检测与识别,需要学习的地方还很多。 方法流程 图像预处理,包括去噪、去除背景、阈值化 图像分割 特征提取 机器分类学习 下面根据该顺序具体介绍相关代码以及效果。 1.图像预处理 首先是去除噪声,本文使用 阅读详情

相关推荐

BS框架的搭建DEMO

用javascript实现动态界面登录和主页框架展示。

OpenCV之机器学习对象分类(二)

计算机视觉和机器学习工作流程 预处理/分割/特征提取/分类结果/后处理 1,输入图像的预处理,包括去除光和噪声、滤波、模糊等,参考上一篇文章。 Mat removeLight(Mat img, Mat pattern, int method) { Mat aux; //if method is normalization if (method == 1) { //Require cha...

mei_true的博客 825

关于基于Midas Civil API的二次开发——PyMiMi

现在写了第一条博客,希望是一个好的开始,能够每天抽出一两个小时或者更多的时间来写写代码,研究研究。我发现在我的工作中存在着大量的重复性工作,对于文档的开发是好办的,毕竟网上有现成库,只需要pip一下拿来用就好,但是对于Midas而言,在24版本之前官方都是没有一个可以使用的接口的,可能mct文件算半个?

ManiacsTraitor的博客 1850

BS版图形系统 - OpenCV - 第5章笔记

BS版图形系统 - OpenCV - 第5章笔记5 自动光学检查、对象分割和检测5.1 技术要求5.2 隔离场景中的对象5.3 为AOI创建应用程序5.4 预处理输入图像5.4.1 噪声消除5.4.2 用光模式移除背景进行分割5.4.3 阈值5.5 分割输入图像5.5.1 连通组件算法5.5.2 findContours算法5.6 总结 ** QQ: 282397369 ** 5 自动光学检查、对象分割和检测 AOI:自动光学检查 5.1 技术要求 5.2 隔离场景中的对象 预处理: 噪声消除 光消

drgraph的博客 261

OpenClaw 接入智谱 GLM-5-Turbo 龙虾套餐:完整避坑指南与 SOP

OpenClaw 接入智谱 GLM-5-Turbo 的核心在于“端点匹配”和“多渠道验证”。端点匹配:龙虾套餐必须用标准端点。多渠道验证:遇到 TUI 不显示时,用curl或飞书机器人验证,不要被 Bug 误导。希望这份 SOP 能帮你顺利跑通 OpenClaw + GLM-5-Turbo,享受强大的 AI 编程助手!

Aaron_liu20的博客 1701

Cadence IC618/Spectre231安装避坑指南:详解环境变量配置与License管理那些事儿

本文深入解析Cadence IC618/Spectre231安装过程中的环境变量配置与License管理难题,提供从变量冲突解决到高效License管理的实用方案。针对常见的64位标识冲突、路径污染及License服务器连接问题,给出具体诊断步骤和优化建议,帮助用户构建稳定可靠的EDA环境。

weixin_33737134的博客 616

BS版图形系统 - OpenCV - 第1章笔记

BS版图形系统 - OpenCV - 第1章笔记1 OpenCV入门1.1 了解人类视觉系统1.2 人类如何理解图像内容1.3 能用OpenCV做什么1.3.1 内置数据结构和输入/输出1.3.2 图像处理操作1.3.3 GUI1.3.4 视频分析1.3.5 3D重建1.3.6 特征提取1.3.7 对象检测1.3.8 机器学习1.3.9 计算摄影1.3.10 形状分析1.3.11 光流算法1.3.12 人脸和对象识别1.3.13 表面匹配1.3.14 文本检测和识别1.3.15 深度学习1.4 安装Open

drgraph的博客 390

Win11/Win10系统下,Proe5.0 M280终极版保姆级安装与激活指南(含SSQ补丁避坑)

本文提供Win11/Win10系统下Pro/E 5.0 M280终极版的详细安装与激活指南,涵盖环境配置、SSQ补丁应用及常见问题解决方案。通过系统调整、分步安装和性能优化,确保软件在现代操作系统上的稳定运行,特别适合机械设计用户参考。

weixin_30895059的博客 442

BS版图形系统 - OpenCV - 第4章笔记

BS版图形系统 - OpenCV - 第4章笔记4 深入研究直方图和滤波器4.1 技术要求4.2 生成CMake脚本文件4.3 创建图形用户界面4.4 绘制直方图4.5 图像颜色均衡4.6 Lomography效果4.7 卡通效果4.8 总结 QQ: 282397369 4 深入研究直方图和滤波器 4.1 技术要求 4.2 生成CMake脚本文件 4.3 创建图形用户界面 Show histogram Equalize histogram Lomography effect Cartoonize effe

drgraph的博客 220

数字图像处理基础实验(二):直方图均衡化

一、实验内容及原理 1、计算灰度图像的归一化直方图 具体内容:利用 OpenCV 对图像像素进行操作,计算归一化直方图.并在 窗口中以图形的方式显示出来 步骤: (1)初始化一个256大小的数组,存放图像中每级灰度值的像素点的个数 (2)遍历整张图像 (3)归一化数组 2、灰度图像直方图均衡处理 具体内容:通过计算归一化直方图,设计算法实现直方图均衡化处理。 步骤: (1)读取该像素点的灰度值 (...

lyd1995的博客 4525

SQL Server 2025在Windows 11上的安装避坑指南

SQL Server 是微软主流关系型数据库管理系统,其安装与Windows操作系统深度耦合;Windows 11作为新一代桌面平台,强化了基于虚拟化的安全(HVCI)、驱动签名强制策略(WDAC)及内核隔离机制,导致传统数据库部署流程失效。理解二者底层交互原理,是解决服务启动失败、配置管理器无法打开、远程连接被拒等高频问题的技术前提。本文聚焦SQL Server 2025与Windows 11的兼容性挑战,覆盖系统预配置、安装节点诊断、防火墙与服务权限调优等工程实践环节,适用于高校教学、电赛备赛、中小企业

weixin_28741413的博客 317

BS版图形系统 - OpenCV - 第2章笔记

BS版图形系统 - OpenCV - 第2章笔记2 OpenCV基础知识导论2.1 技术要求2.2 基本CMake配置文件2.3 创建一个库2.4 管理依赖项2.5 让脚本更复杂2.6 图像和矩阵2.7 读/写图像2.8 读取视频和摄像头2.9 其他基本对象类型VecScalarPointSizeRectRotatedRect2.10 基本矩阵运算2.11 基本数据存储2.12 总结 QQ 282397369 2 OpenCV基础知识导论 2.1 技术要求 2.2 基本CMake配置文件 2.3 创建一个库

drgraph的博客 191

拯救我的老平板三星note8.0 table(GT-N5110)升级到lineage os-14.1(android7.1)全记录

买了多年的三星平板note8.0已经闲置了一段时间,今天在家不能出门,也没啥事,就把它拿出来刷新系统。不成想居然搞了一天,还差点变成了砖。 原版的系统是安卓4.0的系统,很多软件已经不能用了,微信、优酷都不支持,而且三星也不提供更新升级,于是寻求第三方解决方案。折腾过程一波三折,就不赘述了,我就讲一下正确的操作过程吧。 切记我这里讲的过程只针对三星note8.0 table,国行版本,版本号是...

weixin_41108814的博客 2万+

BS版图形系统 - OpenCV - 第3章笔记

BS版图形系统 - OpenCV - 第3章笔记3 学习图形用户界面3.1 技术要求3.2 OpenCV用户界面介绍3.3 OpenCV的基本图形用户界面3.4 QT图形用户界面3.5 OpenGL支持3.6 总结 QQ 282397369 3 学习图形用户界面 显示图像结果,处理用户与图像的交互。 3.1 技术要求 3.2 OpenCV用户界面介绍 基于原生用户界面的基本界面: GTK 基于QT库的略微更高级的界面 3.3 OpenCV的基本图形用户界面 highgui模块 #include &

drgraph的博客 170

提示工程架构师干货:AI上下文工程在社交媒体舆情溯源中的应用

在舆情溯源中,“上下文”不是单一的“文本内容”,而是多维度、多源的信息集合溯源时间:从事件爆发到找到源头,只用了24小时(传统方法需要3-5天);溯源准确性:100%(通过人工验证确认);后续行动:品牌X发布了澄清声明,揭露了品牌Y的恶意行为,舆情在48小时内平息。社交媒体舆情溯源是一个“复杂的系统工程”,需要结合数据、模型、上下文理解。AI上下文工程的出现,让我们从“被动应对”转向“主动溯源”,从“模糊判断”转向“精准分析”。

Java大师兄的博客 812

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

OpenCV Mat矩阵(图像Mat)初始化及访问方法

文章详细介绍了OpenCV Mat矩阵(图像Mat)初始化及访问方法

duiwangxiaomi的博客 7万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

在opencv3中的机器学习算法

转载:https://www.cnblogs.com/denny402/p/5032232.html 在opencv3.0中,提供了一个ml.cpp的文件,这里面全是机器学习的算法,共提供了这么几种: 1、正态贝叶斯:normal Bayessian classifier 我已在另外一篇博文中介绍过:在opencv3中实现机器学习之:利用正态贝叶斯分类 2、K最近邻:k nearest...

深之JohnChen的专栏 2441

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SAP B1中文培訓教材_SDK

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

OpenCV——SVM学习(二)

这一次主要是实践部分.首先还是贴出源码.#include&amp;lt;opencv2\opencv.hpp&amp;gt; #include &amp;lt;vector&amp;gt; #include&amp;lt;iostream&amp;gt; using namespace std; using namespace cv;#define n 8 //n个训练样本 int main() { //【1】 设置

优快云_dzh的博客 661

DrGraph原理示教 - OpenCV 4 功能 - 阈值

参数4:阈值的方式,主要有5种,分别为cv.THRESH_BINARY、cv.THRESH_BINARY_INV、cv.THRESH_TRUNC、cv.THRESH_TOZERO、cv.THRESH_TOZERO_INV。有时间看下源码就可以不用猜测了。二进制阈值化:选择一个特定的阈值量,大于该阈值的像素点的灰度值设定为最大值(如8位灰度值最大为255),小于该阈值的像素点的灰度值设定为0。反阈值化为0:与阈值化为0类似,只是像素点的灰度值大于该阈值的不进行任何改变,而小于该阈值的,其灰度值全部变为0。

drgraph的博客 1447

DrGraph原理示教 - OpenCV 4 功能 - 颜色空间

前段时间,甲方提出明确需求,让把软件国产化。稍微研究了一下,那就转QT开发,顺便把以前的功能代码重写一遍。至于在Ubuntu下折腾QT、OpenCV安装事宜,网上文章很多,照猫画虎即可。QT 6支持C++ 17,里面很多C++的新功能,用起来更为舒爽。QT Creator中,代码提示更快捷,代码折叠也很准确QT Creator中,文档生成更方便,配合Doxygen之后,自己都感觉更专业了当然,更让我高兴的是,QT直接支持最新版的OpenCV,以前还一直停留在2.3版。

drgraph的博客 1442

DrGraph原理示教 - OpenCV 4 功能 - 直方图

OpenCV直方图是一种可以对整幅图的灰度分布进行整体了解的图示。它是带有像素值(从0到255,不总是)的图在X轴上,在y轴上的图像对应的像素个数。通过观察图像的直方图,我们可以直观的了解图像的对比度、亮度、亮度分布等。在直方图中,横坐标表示图像中各个像素点的灰度级,纵坐标表示具有该灰度级的像素个数。直方图的左边部分显示了图像中较暗像素的数量,右边区域显示了更明亮的像素。直方图是非常常用的图像处理方法,有时在很多图像预处理中能起到特别好的效果。

drgraph的博客 1361

BS版图形系统 - 界面控件配置

BS版图形系统 - 界面控件配置界面控件考虑资源配置化XML资源配置加载下一步任务 QQ: 282397369 界面控件考虑 有了属性浏览器,下来就该处理工具栏了。 一个直观感觉,网页留给程序的空间,要比应用程序少。网页在浏览器这个程序中运行,不同的浏览器,提供相应的界面,占据标题、工具栏位置,甚至书签与侧栏。所以做网页程序的时候,尽量能将工作区整大一些。 当然,如何整应该是UI设计的事,技术层面还是关心如何实现的问题。 在属性浏览器的基础上,初步实现了一个VCL的JS框架。但新建控件,还是要写一堆代码来控

drgraph的博客 1270

BS版图形系统 - 画线

BS版图形系统 - 画线 一晃两个月过去了,儿子也考了个喜欢的大学,重新,又稳定了下来。 我也重操旧业,编点小程序。时不时发个小博客,自娱自乐一下。 今天处理图元 - 线。 话不多说,直接上代码。 export class TLine extends TTwoPointMeta { beginArrow: TArrow = new TArrow; endArrow: TArrow = new TArrow; Initial() { this.setClassType(

drgraph的博客 774

DrGraph原理示教 - OpenCV 4 功能 - 二值化

二值化,也就是处理结果为0或1,当然是针对图像的各像素而言的1或0,对应于有无,也就是留下有用的,删除无用的,有用的部分,就是关心的部分在图像处理中,也不仅仅只是1或0,因为这两个值看起来都是黑的,人眼很难分辨清楚,那就放大一些,255或0,黑白就出来了目标识别、图像分割、目标提取等后续应用,很多会基于二值化的结果。所以图像分析的二值化处理是一个重要环节。

drgraph的博客 734

DrGraph - SVG模块之一:显示与节点选择

DrGraph - SVG模块之一:显示与节点选择显示SVG编辑生成目标子集SVG 对于虚拟面板中的元件,以前采用FLASH技术实现相应显示与交互,通过ActionScript进行通信。现在看来,FLASH好象势微,使用起来有点麻烦,需要一些设置。其次,做FLASH的人也少了,后续也不太方便。 那就用SVG来进行改造。 显示SVG 将SVG解析置于DLL中,应用程序直接调用DLL完成解析并生成PNG,然后再画出显示。 UnicodeString filename = FResponseNode->At

drgraph的博客 680
上一篇: BS版图形系统 - Ribbon Gallery
下一篇: 脚本为王 - 辅助功能
DrGraph
博客等级 码龄14年 228粉丝 77原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值