分类目录归档:opencv

C# 中使用 OpencvSharp 与 TensorflowSharp 进行Mask-RCNN模型的预测

网上可以找到许多TensorFlow的Mask-RCNN版本,现以github上一个Star较多的版本为例,介绍如何在C#中部署Mask-RCNN模型

一.前期准备

1.同步Mask-RCNN的代码,地址为 https://github.com/matterport/Mask_RCNN.git

2.训练模型:
可以使用jupyter打开samples文件夹下的例子进行训练,也可以参考其例子训练自己的模型。目标是生存保存好权重的模型文件。模型每训练一个epochs 会在 model_dir=MODEL_DIR 设置好的文件夹下留下模型文件。具体训练方法就不累述了~~~

3.在VS里使用Nuget,给项目添加OpencvSharp 与 TensorflowSharp

继续阅读

OpencvSharp 中使用 cuda

opencvsharp 是 opencv的c#版本,近期有项目使用了opencvsharp来进行图像处理。这个github上星级很高的项目果然是不错的,运行起来比较稳定,没有出现大的问题。但opencvsharp中没有cuda的完整支持,只有最基本的类型支持,无任何算法支持,想用就只能靠自己添加了。作者的解释如下:

大概就是说cuda需要用户自己编译opencv ,没有一个统一版本的dll提供使用,所以就删除了cuda的支持
其实也对,cuda的使用涉及cuda版本,使用的显卡算力等。使用c++版本的opencv时,也是要自己编译的。
但c#上使用就没有办法了吗?还好作者已经打好了基础,提供了GpuMat的支持,并有大量cup版本的函数进行参考。添加起来还是比较容易的。
项目目录 https://github.com/shimat/opencvsharp

继续阅读

opencv + tensorflow + C++ 对RSNet模型进行预测

本文介绍了一种使用opencv + c++ 可以在生产环境下调用tensorflow pb文件进行预测的方法。
该方法不需要在生产环境下搭建python运行环境。 流程上相对简单清晰。如果要将神经网络/机器学习添加到几年前项目中,也比较简单可行。

一.pb文件的生成

本人使用的RsNet模型完全参考github上官方给出的demo训练生成。网址https://github.com/tensorflow/models
训练入口文件official/resnet/imagenet_main.py (主线版本 v1.8.1)
只定义了2个分类,具体的训练方法就不再累

训练完成后会在根目录生成一个imagenet_model文件夹,里面存储了模型文件(ckpt文件)。接下来需要将模型文件固化成pb文件。为了让opencv可以使用这个pb文件,需要定义好神经网络input入口与output出口

继续阅读

Matrox Imaging Libray Standard模式拍照方法– VA-29MC-M5

使用该拍照方法 相机无需连接触发信号线 只需要camera link线就可以实现standard拍照模式

1.相机设置

触发模式设置为 Standard

Exposure设置为 Pulse Width

Source设置为 CC1

2.DCF配置文件

Continuous_VN-29M5(80MHz)_10bit_12bit_2tap_Top_Bottom_CC1TriggerEvent

继续阅读

Matrox Imaging Libray 开发实例

一.数据类型

MIL_ID: MIL标准的实例化类型

MIL_INT:整数类型,可以转化未INT类型使用。但使用MIL库函数时,必须使用MIL_INT,不要用INT代替。部分情况下会计算错误

MIL_DOUBLE:类似同上

二.典型函数举例

1.实例化系统环境

MIL_ID MilApplication,MilSystem;

/* Allocate a MIL application. */
MappAlloc(M_NULL, M_DEFAULT, &MilApplication);

/* Allocate a MIL system. */
MsysAlloc(M_DEFAULT, M_SYSTEM_HOST, M_DEFAULT, M_DEFAULT, &MilSystem);

2.载入/保存图片

MIL_ID MilImage;

MbufRestore(filename.toUtf8().data(), MilSystem,&MilImage);//读取图片

MbufExport(temps.toUtf8().data(),M_PNG,MilImage);//保存成PNG

3.获取图片信息

MIL_INT SrcImageSizeX = 0;
MIL_INT SrcImageSizeY = 0;
MIL_INT SrcImageType = 0;
void* SrcImageDataPtr = M_NULL;
MIL_INT SrcImagePitchByte = 0;
MIL_INT SrcImageDataSize = 0;

MbufInquire(MilImage, M_SIZE_X, &SrcImageSizeX);//宽
MbufInquire(MilImage, M_SIZE_Y, &SrcImageSizeY);//高
MbufInquire(MilImage, M_TYPE, &SrcImageType);//图片类型
MbufInquire(MilImage, M_HOST_ADDRESS, &SrcImageDataPtr);//数据指针
MbufInquire(MilImage, M_PITCH_BYTE, &SrcImagePitchByte);//PitchByte
MbufInquire(MilImage, M_SIZE_BYTE, &SrcImageDataSize);//DataSize

4.获取图片最大最小值

MimAllocResult(MilSystem, M_DEFAULT, M_STAT_LIST, &MilExtreme);
MimStat(MilImage, MilExtreme, M_MAX + M_MIN, M_NULL, M_NULL, M_NULL);//设置要获取值的类型
double max = 0;
double min = 0;
MimGetResult(MilExtreme, M_MAX + M_TYPE_DOUBLE, &max);
MimGetResult(MilExtreme, M_MIN + M_TYPE_DOUBLE, &min);

5.简单计算

MimArith(MilImage, -min, MilImage, M_ADD_CONST);//加一个常数
MimArith(MilImage, scale, MilImage, M_MULT_CONST);//乘一个常数

6.边缘检测

MIL_ID MilEdgeContext,MilEdgeResult;

MedgeAlloc(MilSystem, M_CONTOUR, M_DEFAULT, &MilEdgeContext);
MedgeAllocResult(MilSystem, M_DEFAULT, &MilEdgeResult);

MedgeControl(MilEdgeContext, M_CENTER_OF_GRAVITY, M_ENABLE);//启用计录轮廓位置
MedgeControl(MilEdgeContext, M_AVERAGE_STRENGTH+M_SORT1_DOWN, M_ENABLE);//计算平均强度,并设置排序方式
MedgeControl(MilEdgeContext, M_THRESHOLD_MODE, M_USER_DEFINED);//启用自定义THRESHOLD_MODE
MedgeControl(MilEdgeContext, M_THRESHOLD_LOW, 50);//设置阀值

MedgeCalculate(MilEdgeContext, MilImage, M_NULL,M_NULL, M_NULL, MilEdgeResult,M_DEFAULT);//计算轮廓

MedgeGetResult(MilEdgeResult, M_DEFAULT, M_NUMBER_OF_CHAINS+M_TYPE_MIL_INT,&NumEdgeFound, M_NULL);//获取轮廓数量

MedgeGetResult(MilEdgeResult, n, M_CENTER_OF_GRAVITY +M_TYPE_MIL_INT,
&CENTER_OF_GRAVITY_x, &CENTER_OF_GRAVITY_y);//获取特定轮廓的位置