给LUA脚本插上图像识别翅膀

在Lua中实现简单的图像识别 'label1', 'label2', 'label3', -- 替换为实际的标签列表。'label1', 'label2', 'label3', -- 替换为实际的标签列表。print('预测的类别是: ' .. labels[max_idx[1]])print('预测的类别是: ' .. labels[max_idx[1]])我们将使用预训练的VGG-16模型来进行图像识别。-- 调整图像大小并进行标准化。-- 获取预测结果的标签。-- 获取预测结果的标签。-- 加载预训练模型。-- 加载预训练模型。 阅读详情
AI摘要

本文介绍了一种将图像识别功能集成到LUA脚本的方法,通过C++与LUA的交互,实现了图像读取、处理、特征提取等功能。利用OpenCV库,作者创建了一系列图像处理API,并通过LUA脚本调用这些功能,展示了如何处理背景、获取图像特征等应用。


DrGraph QQ:282397369

前言

这个春节一直猫在家,不给政府添乱。今天是元宵节,正想出去一趟,微信群看到一条信息,立马就不动了:今天千万不要外出,不然会被病毒笑话的:原来你们躲得过初一,躲不过十五。 那就先把这个十五躲过去,继续宅。
废话少说,其实我用LUA也就是点皮毛。就用这点皮毛扎个小辫,给LUA提供图像识别功能

准备知识

  • C++与LUA交互,这个在网上一抓一大把
  • 基于C++与LUA的分工,需要首先在C++端提供图像识别的各项功能。我用OpenCV实现图像识别功能。

思路

LUA端类实现

以类的方式实现LUA端的调用代码,最终实现一个drMAT类,并创建一个实例cv。如下代码【后续持续完善,以实现更多功能】

drMAT = class()
cv = drMAT.new()

function drMAT:ctor()
end

function drMAT:MatFromFile(fileName, destMat)
	return drMAT_MatFromFile(fileName, cbw(destMat))
end

function drMAT:SaveMat(mat, fileName)
	return drMAT_SaveMat(mat, fileName)
end

function drMAT:SubMat(mat, rect, destMat, desc)
	return drMAT_SubMat(mat, rect, cbw(destMat), cbw(desc))
end

function drMAT:Convert(mat, method, destMat, desc)
	return drMAT_Convert(mat, method, cbw(destMat), cbw(desc))
end

function drMAT:ToMat_MASK(mat, method, destMat, desc)
	return drMAT_ToMat_MASK(mat, method, cbw(destMat), cbw(desc))
end

function drMAT:Bitwise(mat, bitType, mat2, destMat, desc)
	return drMAT_Bitwise(mat, bitType, cbw(mat2), cbw(destMat), cbw(desc))
end

function drMAT:Filter(mat, filterContent, destMat, desc)
	return drMAT_Filter(mat, cbw(filterContent), cbw(destMat), cbw(desc))
end

function drMAT:GetPosition(mat, subMat, index)
	return drMAT_GetPosition(mat, subMat, cbw(index, "0"))
end

function drMAT:GetFeature(mat, featureName)
	return drMAT_GetFeature(mat, featureName)
end

function drMAT:countNonZero(mat, destMat)
	return drMAT_countNonZero(mat, cbw(destMat))
end

function drMAT:resize(mat, size, destMat, desc)
	return drMAT_resize(mat, size, cbw(destMat), cbw(desc))
end

function drMAT:GetIcon(mat, mask, iconSize, index, destMat, desc)
	return drMAT_GetIcon(mat, mask, iconSize, cbw(index, "0"), cbw(destMat), cbw(desc))
end

function drMAT:FillMat(mat, value, rect, desc)
	return drMAT_FillMat(mat, value, cbw(rect, "(0, 0, 0, 0)"), cbw(desc))
end

LUA端调用

直接调用实例对象的方法函数即可。
如要取得某Mat子图,直接调用mat = cv:SubMat(mat, “86, 712, 1120, 4”)

C++端实现

主要是响应相应的LUA调用

bool __fastcall TDrGraphScriptManager::OnLuaRequest_MAT(TDrLUA * lua, UnicodeString funName, TStrings * params) {
	int paramIndex = 0;
	UnicodeString firstParam = THelper::GetLuaParamAt(params, paramIndex++);
	if(IsSame(L"drMAT_MatFromFile", funName)) 	{
		UnicodeString fileName = lua->ParseFileName(firstParam);
		cv::Mat mat = CvHelper::EmptyMat();
		if(FileExists(fileName))
			mat = CvHelper::MatFromFile(fileName);
		lua->AddReturnValue(mat, NextTwoParam(params, paramIndex), "文件读入图像");
	} else if(THelper::String::IsStartWith(funName, L"drMAT_")) { // 以下首参为图像对象
		cv::Mat srcMat = lua->ParseMat(firstParam);
		cv::Mat resultMat = CvHelper::EmptyMat();
		if(srcMat.empty()) {
			funName.Delete(1, 6);
			lua->LogWarning(THelper::FormatString(L"第 %d 行警告:ApiMat调用%s函数时,待处理图像对象(第一个参数)为空,请检查!", lua->CurrentLine, funName));
			return false;
		}
		if(IsSame(L"drMAT_SaveMat", funName)) {
			UnicodeString fileName = lua->ParseFileName(THelper::GetLuaParamAt(params, paramIndex++), !FILE_MUST_EXISTED);
			CvHelper::MatToFile(srcMat, fileName);
		} else if(IsSame(L"drMAT_SubMat", funName)) {
			cv::Rect rect = lua->ParseRect(THelper::GetLuaParamAt(params, paramIndex++));
			resultMat = CvHelper::CopySubMat(srcMat, rect);
			lua->AddReturnValue(resultMat, NextTwoParam(params, paramIndex), "子图");
		} else if(IsSame(L"drMAT_FillMat", funName)) {
			BYTE value = TTypeConvert::Str2Int(THelper::GetLuaParamAt(params, paramIndex++));
			cv::Rect rect = lua->ParseRect(THelper::GetLuaParamAt(params, paramIndex++));
			cv::Mat dstMat = srcMat;
			if(rect.width > 0) {
				CvHelper::ConstraintRect(rect, srcMat);
				dstMat = srcMat(rect);
			}
			CvHelper::FillMat(dstMat, value);
			resultMat = srcMat;
			lua->AddReturnValue(resultMat, firstParam + THelper::GetLuaParamAt(params, paramIndex++, L""), "填充图像");
		} else if(IsSame(L"drMAT_Convert", funName)) {
			UnicodeString method = THelper::GetLuaParamAt(params, paramIndex++);
			UnicodeString desc = L"转换图像";
			if(IsSame(L"Gray", method)) {
				resultMat = CvHelper::ToMat_GRAY(srcMat);
				desc = L"灰度图";
			} else if(IsSame(L"GrayMAX", method)) {
				resultMat = CvHelper::ToMat_MaxGRAY(srcMat);
				desc = L"最大灰度图";
			} else if(IsSame(L"GrayMin", method)) {
				resultMat = CvHelper::ToMat_MinGRAY(srcMat);
				desc = L"最小灰度图";
			} else if(IsSame(L"WhiteBackground", method)) {
				cv::Mat foreMaskMat = GetForeMat(srcMat);
				resultMat = cv::Mat(srcMat.rows, srcMat.cols, srcMat.type());
				CvHelper::FillMat(resultMat, 0xFF);
				srcMat.copyTo(resultMat, foreMaskMat);
				desc = L"白色背景图";
			} else if(method.Pos(L"=")) {
				UnicodeString name = THelper::String::GetStringAt(method, L"=", 0).Trim();
				UnicodeString value = THelper::String::GetStringAt(method, L"=", 1).Trim();
				if(IsSame(L"threshold", name)) {
					BYTE thresValue = TTypeConvert::Str2Int(value);
					threshold(srcMat, resultMat, thresValue, 0xFF, cv::THRESH_BINARY);
					desc = L"二值图";
				} else if(IsSame(L"ratio", name)) {
					double ratio = value.ToDouble();
					if(ratio > 0)
						resize(srcMat, resultMat, cv::Size(srcMat.cols * ratio, srcMat.rows * ratio));
					desc = L"缩放图";
				} else if(IsSame(L"Background", name)) {
					cv::Mat foreMaskMat = GetForeMat(srcMat);
					cv::Mat foreSrcMat = srcMat.clone();
					BYTE bkValue = TTypeConvert::Str2Int(THelper::String::GetStringAt(value, L",", 0).Trim());
					resultMat = cv::Mat(srcMat.rows, srcMat.cols, srcMat.type());
					CvHelper::FillMat(resultMat, bkValue);
					UnicodeString foreValue = THelper::String::GetStringAt(value, L",", 1).Trim();
					if(foreValue.Length()) {
						bkValue = TTypeConvert::Str2Int(foreValue);
						CvHelper::FillMat(foreSrcMat, bkValue);
					}
					foreSrcMat.copyTo(resultMat, foreMaskMat);
				}
			} else if(method.LowerCase().Pos(L"threshold") == 1) {
				BYTE thresValue = TTypeConvert::Str2Int(THelper::String::GetStringAt(method, L"=", 1));
				threshold(srcMat, resultMat, thresValue, 0xFF, cv::THRESH_BINARY);
				desc = L"二值图";
			} else if(method.LowerCase().Pos(L"ratio") == 1) {
				double ratio = THelper::String::GetStringAt(method, L"=", 1).Trim().ToDouble();
				if(ratio > 0)
					resize(srcMat, resultMat, cv::Size(srcMat.cols * ratio, srcMat.rows * ratio));
				desc = L"缩放图";
			}
			lua->AddReturnValue(resultMat, NextTwoParam(params, paramIndex), desc);
		} else if(IsSame(L"drMAT_Bitwise", funName)) 	{
			UnicodeString type = THelper::GetLuaParamAt(params, paramIndex++);
			if(IsSame(L"not", type)) {
				bitwise_not(srcMat, resultMat);
			} else {
				cv::Mat mat2 = lua->ParseMat(THelper::GetLuaParamAt(params, paramIndex++));
				if(IsSame(L"and", type))
					bitwise_and(srcMat, mat2, resultMat);
				else if(IsSame(L"or", type))
					bitwise_or(srcMat, mat2, resultMat);
				else if(IsSame(L"xor", type))
					bitwise_xor(srcMat, mat2, resultMat);
			}
			lua->AddReturnValue(resultMat, NextTwoParam(params, paramIndex), THelper::FormatString(L"%s位操作结果图", type));
 		} else if(IsSame(L"drMAT_Filter", funName)) 	{
			UnicodeString filterContent = THelper::GetLuaParamAt(params, paramIndex++);
			UnicodeString filterName = THelper::String::GetStringAt(filterContent, L";").Trim();
			THelper::String::EnsureWithStart(filterName, L"TFilter_");

			TFilterBase * filter = NewFilterByType(filterName);
			if(filter) {
				int count = THelper::String::SplitNumber(filterContent, L";");
				for(int i = 1; i < count; ++i) {
					UnicodeString param = THelper::String::GetStringAt(filterContent, L";", i).Trim();
					int index = THelper::String::GetStringAt(param, L"=", 0).ToInt();
					param = THelper::String::GetStringAt(param, L"=", 1).Trim();
					double value = THelper::String::GetStringAt(param, L",", 0, true, L"0").ToDouble();
					double ratio = THelper::String::GetStringAt(param, L",", 1, true, L"1").ToDouble();
					filter->SetValue(index, value, ratio);
				}
				resultMat = srcMat.clone();
				filter->FilterProcess(resultMat);
				delete filter;
			}
			lua->AddReturnValue(resultMat, NextTwoParam(params, paramIndex), THelper::FormatString(L"%s滤镜结果图", filterName));
		} else if(IsSame(L"drMAT_GetPosition", funName)) {
			UnicodeString subMatContent = THelper::GetLuaParamAt(params, paramIndex++);
			TPoint resultPos(-1, -1);
			if(subMatContent.Pos(L"<<")) {
				TPositionOption option;
				option.ReadFromString(subMatContent);
				CvRects allRects = CvHelper::UIParse_GetEdit(srcMat, option);
				int size = allRects.size();
				UnicodeString indexText = THelper::GetLuaParamAt(params, paramIndex++, L"0").Trim().LowerCase();
				int index = indexText.ToInt();
				if(index < 0)
					index += size;
				if(IS_IN_RANGE(index, 0, size - 1)) {
					CvRect r = allRects[index];
					resultPos = TPoint(r.x + r.width / 2, r.y + r.height / 2);
				}
			} else if(THelper::String::IsStartWith(subMatContent.LowerCase(), L"icon")) {
				UnicodeString iconName = THelper::String::GetStringAt(subMatContent, L"=", 1).Trim();
				cv::Mat iconMat = lua->ParseMat(iconName);
				cv::Mat whiteBkMat = GetWhiteBackgroundMat(srcMat);
				cv::Mat maskMat = CvHelper::BuildTransMaskMat(whiteBkMat, clWhite, 5);
				bitwise_not(maskMat, maskMat);
				CvRects rects = GetIconRects(maskMat, iconMat.cols, iconMat.rows);
				CBW_ITERATOR(CvRects, rects) {
					cv::Mat dstMat = CvHelper::CopySubMat(whiteBkMat, *it);
					if(CvHelper::IsSameIcons(dstMat, iconMat, false, true, 0.90, false, 3, false, false)) {
						resultPos = TPoint(it->x + it->width / 2, it->y + it->height / 2);
						break;
					}
				}
			} else {
				UnicodeString fileName = lua->ParseFileName(subMatContent, !FILE_MUST_EXISTED);
				cv::Mat subMat;
				if(FileExists(fileName))
					subMat = CvHelper::MatFromFile(fileName);
				else
					subMat = lua->ParseMat(subMatContent);
				if(!subMat.empty())
					resultPos = CvHelper::GetSubMatPos(srcMat, subMat);
			}
			lua->AddReturnValue(resultPos);
		} else if(IsSame(L"drMAT_ToMat_MASK", funName)) {
			UnicodeString method = THelper::GetLuaParamAt(params, paramIndex++);
			UnicodeString type = THelper::String::GetStringAt(method, L",", 0).Trim();
			UnicodeString value1 = THelper::String::GetStringAt(method, L",", 1).Trim();
			UnicodeString value2 = THelper::String::GetStringAt(method, L",", 2).Trim();
			int v1 = TTypeConvert::Str2Int(value1);
			if(IsSame(L"Color", type)) {
				if(value2.Length()) {
					int delta = TTypeConvert::Str2Int(value2);
					resultMat = CvHelper::BuildTransMaskMat(srcMat, TColor(v1), delta);
				} else
					resultMat = CvHelper::BuildTransMaskMat_ColorPass(srcMat, v1);
			} else if(IsSame(L"Gray", type)) {
				if(value2.Length()) {
					int delta = TTypeConvert::Str2Int(value2);
					resultMat = CvHelper::BuildTransMaskMat(srcMat, BYTE(v1), delta);
				} else
					resultMat = CvHelper::BuildTransMaskMat(srcMat, BYTE(v1));
			}
			lua->AddReturnValue(resultMat, NextTwoParam(params, paramIndex), L"屏蔽图");
		} else if(IsSame(L"drMAT_GetIcon", funName)) {
			cv::Mat maskMat = lua->ParseMat(THelper::GetLuaParamAt(params, paramIndex++));
			UnicodeString iconSizeString = THelper::GetLuaParamAt(params, paramIndex++);
			int iconWidth = THelper::String::GetRegMatchAt_Int(iconSizeString, L"-?\\d+", 0);
			int iconHeight = THelper::String::GetRegMatchAt_Int(iconSizeString, L"-?\\d+", 1);
			int index = THelper::GetLuaParamAt(params, paramIndex++, L"0").Trim().ToInt();

			CvRects rects = GetIconRects(maskMat, iconWidth, iconHeight);
			if(index < 0)	index += rects.size();
			if(IS_IN_RANGE(index, 0, rects.size() - 1)) {
				cv::Rect r = rects[index];
				resultMat = CvHelper::CopySubMat(srcMat, r);
			}
			lua->AddReturnValue(resultMat, NextTwoParam(params, paramIndex), L"目标图标");
		} else if(IsSame(L"drMAT_GetFeature", funName)) {
			UnicodeString featureName = THelper::GetLuaParamAt(params, paramIndex++);
			if(IsSame(L"countNonZero", featureName)) {
				cv::Mat tempMat = CvHelper::ToMat_GRAY(srcMat);
				threshold(tempMat, tempMat, 0x7F, 0xFF, cv::THRESH_BINARY);
				lua->AddReturnValue(int(countNonZero(tempMat)));
			} else if(IsSame(L"whiteWeight", featureName)) {	// 白色比重
				cv::Mat tempMat = CvHelper::ToMat_GRAY(srcMat);
				threshold(tempMat, tempMat, 0x7F, 0xFF, cv::THRESH_BINARY);
				double result = int(countNonZero(tempMat)) * 100.0 / tempMat.total();
				lua->AddReturnValue(result);
			}
		} else if(IsSame(L"drMAT_countNonZero", funName)) {
			cv::Mat tempMat = CvHelper::ToMat_GRAY(srcMat);
			threshold(tempMat, tempMat, 0x7F, 0xFF, cv::THRESH_BINARY);
			int count = countNonZero(tempMat);
			lua->AddReturnValue(count);
		} else if(IsSame(L"drMAT_resize", funName)) {
			TPoint size = lua->ParsePoint(THelper::GetLuaParamAt(params, paramIndex++));
			resize(srcMat, resultMat, cv::Size(size.x, size.y));
			lua->AddReturnValue(resultMat, NextTwoParam(params, paramIndex), L"缩放图");
		} else return false;
	} else return false;
	return true;
}

实例调用

简单测试一个背景处理功能

测试用图

在这里插入图片描述

测试用LUA代码

function test()
	Initial()
	realTimeMat = win:GetRealtimeMat(realTimeMat)
	tempMat = cv:Convert(realTimeMat, "Background=0xFF, 0x0") 	-- 白色背景,黑色前景
	tempMat = cv:Convert(realTimeMat, "Background=0x0, 0xFF")	-- 黑色背景,白色前景	
	tempMat = cv:Convert(realTimeMat, "Background=0xFF")		-- 白色背景,前景不变
	tempMat = cv:Convert(realTimeMat, "Background=0x0")			-- 黑色背景,前景不变
	return LUA_STATUS_OK		
end

运行结果

在这里插入图片描述

总结

方法可行,基于此可实现各种脚本自动化。先把已有功能写成文档,便于后续开发使用。
在这里插入图片描述

使用Lua实现图标点选验证码识别及分割 图标点选验证码的破解通常分为两个步骤:图标分割和图标识别。图标识别则是判断用户点击的图标是否与指定的目标图标相匹配。为了适应模型的输入要求,需要对图像进行缩放和填充。加载模型并进行图标检测。这里我们使用简单的颜色阈值方法来检测图标的位置。对图标进行特征提取,以便后续的相似度比较。使用提取的特征进行相似度比较,判断用户点击的图标与目标图标是否匹配。更多内容联系1436423940。-- 使用阈值检测对象。-- 转换为灰度图像。-- 调整图像大小并填充。-- 图像处理和检测对象。-- 保存调整后的图像。 阅读详情

相关推荐

【Cocos2d-x游戏开发lua篇之基础】加载图片与设置按钮监听事件

①加载图片加载图片到屏幕中心local MainScene = class("MainScene", cc.load("mvc").ViewBase)function MainScene:onCreate() local s1 = display.newSprite("Star.png") :move(display.center) :addTo(self)e

ZY_cat的博客 2648

Lua与c++交互实战基础篇

本课程从实战角度讲解了流行的高性能脚本Lua与c++的联合开发,这套方案已经被大量的对性能由要求的系统使用,成为了高性能脚本的唯一方案,像大量的游戏在使用lua,比如魔兽世界、博德之门、仙剑奇侠传五等,高性能的视频应用也在用lua&c++(比如笔者的公司),还有近击败了韩国围棋的AlphaGo也是使用了 c++&lua;的方案。

在Android上使用OpenCV

导入OpenCV库:在Android Studio的项目视图中,右键单击您的项目,然后选择"Open Module Settings"。下载OpenCV Android SDK:您可以从OpenCV官方网站上下载适用于Android的OpenCV SDK。创建一个新的Activity:在Android Studio中创建一个新的Activity,用于展示图像并进行处理。在Android Studio中创建新项目:打开Android Studio,并创建一个新的Android项目。步骤1:设置开发环境。

UtiExamples的博客 1329

lua实现图像识别代码

require'cv.videoio'--Videostream require'cv.imgproc'--Imageprocessing(resize,crop,drawtext,...) require'nn' localcapture=cv.VideoCapture{device=0} ifnotcapture:isOpened()then print("Failedtoopenthedefaultcamera") os.exit(-1)...

weixin_48807974的博客 2064

LuaCV:Lua 语言的 OpenCV 库包装器-开源

LuaCV 是 Lua 语言的 OpenCV 库包装器。 主要目标是访问快速图像处理库到轻量级、非类型语言。 由于 CMake 项目在 OpenCV 支持的许多操作系统平台下更容易编译它。 LuaCV 正在捷克共和国布尔诺理工大学电气工程和通信学院开发。 使用:Lua 5.2, OpenCV 2.2-2.4 LuaCV-0.2.0 (svn rev. 62) 是与 Lua 5.1 兼容的最新版本,但仅适用于 OpenCV 2.2 及更低版本。

Altium Designer许可证冲突?手把手教你用Windows防火墙彻底禁止AD联网(附详细截图)

本文详细介绍了如何通过Windows防火墙精准管控Altium Designer的网络权限,解决许可证冲突问题。通过配置入站和出站规则,彻底阻断AD的联网行为,提升软件运行效率。适用于需要稳定使用Altium Designer的工程师,附有详细截图和高级验证方法。

weixin_38170137的博客 423

脑语言2500单字v1.5.1

如果人和 AI 说同一种语言,文明会怎样?我用 2500 个单字试了试。2500个单字是不同领域、不同知识的共同体,无论你学编程或者是数学或写作,你都要用汉字,而常用的2500个汉字几乎可以涵盖不同行业做的不同事情。

脑语言 2004

MATPOWER下载安装教程

将MATPOWER文件复制在C:\Program Files (x86)\MATLAB\R2016b\bin目录下。原来的窗口中多了很多文件路径,点击【保存】,再点击【关闭】选择所要添加的MATPOWER文件夹,点击【选择文件夹】二、将MATPOWER放在bin目录下。找到菜单栏的【设置路径】点击【添加并包含子文件】一、从官网下载后解压。

weixin_47365903的博客 2万+

lua手动添加Opencv Mat对象

使用c++的placement new 调用 Mat 类的构造函数,把对象分配在lua的userdata空间中。Mat的生命周期由lua虚拟机管理,跟随lua变量生命周期。

youngboy的博客 1024

别再搞错了!ERA5-Land小时数据里的辐射值,原来不是你想的那个‘瞬时值’

本文深入解析ERA5-Land小时数据中辐射值的累积特性,揭示其与瞬时值的本质区别。通过详细的数据处理方法和Python代码示例,指导研究者正确转换累积辐射量为实用瞬时值,避免常见误区,提升气候模型验证的准确性。

weixin_28700411的博客 208

Windows 10/11 注册表 ProfileImagePath 误改修复:3步恢复用户登录与数据安全

本文详细介绍了Windows 10/11系统中因误改注册表ProfileImagePath键值导致用户无法登录的修复方法。通过3个关键步骤,包括定位SID、安全修复注册表项及验证处理,帮助用户恢复登录并保障数据安全。特别强调了操作顺序的重要性以避免数据丢失,适用于各类Windows用户账户登录错误的紧急处理。

chuoshao2508的博客 403

LUA调试环境(一)

LUA调试环境起因基本编辑工作LUA解析代码折叠简单图示效果断点行号获取切换断点显示断点断点显示效果 QQ:282397369 起因 今年开始,折腾脚本,发现LUA确实能解决大问题,与C++配合起来,天衣无缝的感觉,处理各种业务轻松很多。 用多了,慢慢发觉有些不爽。最大的问题是,脚本没有编译过程,所有问题得等到运行时才能显现,从而导致脚本调试过程比较低效。 那就做一个IDE,先给自己用。 基本编辑...

drgraph的博客 1424

RTL优化与PPA分析:数字电路设计的关键技术

在数字集成电路设计中,RTL(寄存器传输级)优化是提升芯片性能、降低功耗和减小面积的核心技术。通过PPA(Power-Performance-Area)指标的平衡,工程师可以在不同时序约束下实现设计的最优化。本文基于Synopsys Design Compiler和开源工具Yosys的实验数据,展示了RTL优化在算术单元和控制逻辑中的显著效果,特别是在乘法器和除法器等复杂运算模块中。文章还探讨了AI辅助工具在RTL优化中的应用潜力,为数字电路设计提供了实用的技术参考和工程实践建议。

weixin_42186387的博客 619

Lua 调用 Opencv 的方法

Lua 调用 Opencv 的方法      最近想用 Lua 调用 Opencv 进行相关像素级操作,如:bitwise_and 或者 bitwise_or,从而完成图像 IoU 的计算。   那么,怎么用 Lua 调用 Opencv 呢?   查了 Torch 的官方文档,发现只有这么几个可以调用的包:   链接:https://github.com/torch/...

a1424262219的博客 1017

电路设计仿真软件:Mentor Graphics_(1).MentorGraphics电路设计仿真软件概述

菜单栏:包含文件、编辑、视图、工具等菜单。工具栏:提供常用的工具按钮,如打开、保存、仿真等。原理图编辑区:用于绘制电路原理图。元件库:包含各种电路元件,支持拖拽操作。属性面板:显示选中元件的属性,可以进行参数设置。仿真控制区:用于设置仿真参数和控制仿真过程。输出窗口:显示仿真结果和日志信息。打开模型编辑器:点击“工具”菜单,选择“模型编辑器”。选择模型类型:在模型编辑器中选择模型类型,如SPICE模型。输入模型参数:根据需要输入模型的参数,如电阻值、电容值等。保存模型。

kkchenjj的博客 1924

C#上位机之海康相机开发(SDK)实战教程

SDK的接口设计遵循“句柄-操作-释放”模式,掌握→→→的流程,就能完成基础开发;工业场景需重点关注稳定性:断连重连、内存管理、抗干扰(网口相机的IP设置、触发信号的可靠性);进阶功能(如图像处理、多相机同步)需结合视觉库(EmguCV)和硬件特性(GPIO触发),但前提是保证基础采集的稳定。建议新手先跑通SDK自带的C#示例,理解每个函数的作用,再逐步替换为自己的代码。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2193

lua和ssh和opencv的关联

word@一个很诡异的问题

qq_765943201的博客 1517

【YOLOv8科研级优化】基于YOLOv9的GELAN模块重构C2f架构,显著提升模型精度与推理效率

打开确保模型解析器能识别GELANBlock模块。通过将YOLOv9的GELAN模块集成到YOLOv8的C2f模块中,我们实现了一个“强特征表达+高效计算”的目标检测模型。这个改进不仅在工程上能提升复杂场景下的检测效果,更在科研上提供了“多分支特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的改进中,帮你在论文中打造独特的研究点。

FJN110的博客 112

开源项目推荐:LuaJIT+Torch环境下的OpenCV强力绑定

开源项目推荐:LuaJIT+Torch环境下的OpenCV强力绑定 在这个深度学习与计算机视觉如火如荼的时代,每一步技术创新都可能成为推动行业发展的关键。今天,我们要向大家隆重推荐一个将顶级图像处理库OpenCV与高效的LuaJIT及机器学习框架Torch无缝融合的开源宝藏项目——torch-opencv。 项目介绍 torch-opencv是一个旨在为LuaJIT和Torch用户提供便捷接口的开...

gitblog_00700的博客 435

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

穿过已知点画平滑曲线-lua

参考原文 https://www.iteye.com/blog/westice-745173 贝塞尔曲线 为了把一串点连成光滑的曲线,先研究贝塞尔曲线,又搞B样条插值。。。。都没有成功(数学没那么强)。 后来在 “[翻译] AGG 之贝塞尔插值”http://liyiwen.iteye.com/blog/705489。看到一种比较好的方法: 运用贝塞尔曲线的光滑性来穿过这些点。 大致思路就是 先算出相邻原始点的中点,在把相邻中点连成的线段平移到对应的原始点,以平移后的中点作为控制点,相邻原始.

hlmfjkqaz的专栏 586

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Ubuntu18.04+CUDA9.0+cuDNN7.1.3+openface安装总结

  目录   前言 编译工具CMake C++标准库安装 下载OpenFace代码 OpenCV安装 luarocks—Lua 包管理器,提供一个命令行的方式来管理 Lua 包依赖、安装第三方 Lua 包等功能 安装 TORCH—科学计算框架,支持机器学习算法  安装依赖的 LUA库  编译OpenFace代码 下载预训练后的数据 调用Demo测试 前言 Ubuntu...

gmHappy 3031

Cocos2d-x 3.2 Lua示例 ActionTest(动作测试)

Cocos2d-x 3.2 Lua示例 ActionTest(动作测试) 转自 http://blog.youkuaiyun.com/wwj_748/article/details/38272837  本篇博客继续介绍Cocos2d-x的Lua示例,关于3.2的例子变动不是很大,稍微介绍一下3.2的新特性吧: 3.2版本的新特性  * 新的3D动画节点Anima

u012718690的专栏 964

机器视觉开源处理库汇总-介绍n款计算机视觉库/人脸识别开源库/软件 -几种图像处理类库的比较-视觉相关网站

机器视觉开源处理库汇总 从cvchina搞到的机器视觉开源处理库汇总,转来了,很给力,还在不断更新。。。 通用库/General Library OpenCV 无需多言。 RAVL Recognition And Vision Library. 线程安全。强大的IO机制。包含AAM。 CImg 很酷的一个图像处理包。整个库只有一个头文件。包含

ajian005的专栏 1万+

OpenCV findContours函数的参数使用详解

OpenCV中的findContours函数是用来检测物体的轮廓,下面详细说明一下这个函数各参数的意义以及使用。Python代码中的findContours函数如下: findContours(image, mode, method, contours=None, hierarchy=None, offset=None) image:输入的二值图像。 mode:定义轮廓的检索模式,可选项为...

qq_24185239的博客 6338

滤波算法介绍及OpenCV中使用

滤波目录滤波 目录 理论介绍 判断 高斯滤波 中值滤波 均值滤波 双边滤波 各向异性扩散 opencv函数 MAT类型理论介绍1. 判断如何判断噪声是什么,分布如何?该采用什么方法? 高斯噪声 脉冲噪声(椒盐噪声) 分布?进行参数估计2. 高斯滤波高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。 它对去除服从正态分布的噪声很有效。3. 中值滤波中值滤波是一种典型的低通滤波器,主

luanqibaazao的博客 1958

lua图像库_数学库 图形库 机器学习库 随想

本文是 我在 民科吧 帖 《opencv,python是不是用numpy代替了mat的作用?》http://tieba.baidu.com/p/6450706166里的 回复, 我在 帖 里是 K歌之王 。5 楼opencv 是一个 计算机 视觉库, numpy 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。你说用 numpy...

weixin_39822184的博客 456
上一篇: 用Markdown改造程序日志
下一篇: LUA延时控制
DrGraph
博客等级 码龄14年 228粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值