基于机器视觉的锻件检测及相机位姿自动调整

 2022-05-27 22:26:28

论文总字数:35930字

东南大学毕业设计

软件说明书

题 目 基于机器视觉的锻件检测及相机位姿自动调整

机械工程 院(系) 机械工程 专业

学 号 02015728

学生姓名 王冠雄

指导教师 罗晨

起止日期 2019.01-2019.06

设计地点 工业工程系

1软件介绍

在锻件的实时监测中,为保证测量的精度,需要实时捕捉锻件位置并对CCD相机的位姿做出合适的调整。根据需求本软件完成了检测目标位置,跟踪目标并调整相机位姿使得目标处于相机视场中心位置。

软件适用于大恒相机水星家族的MER-G系列及相应硬件。直线模组控制端指令设置为0x9d51,停止为0x9d52,转向为0x9d53。舵机控制端指令设置为9axx、9bxx。

软件适用场景为画面中仅有单一检测物体,检测物体在颜色或亮度上与周围环境有着明显的区分。

软件界面的编写用到c#和QT等,软件主程序的编写用到c 的Opencv4.0库。

软件的流程如下。

图 1软件流程图

2启动器

图 2启动器文件

通过双击打开

图 3启动器界面

启动器用c#编写的Windows窗体应用,,启动器的功能有两个,一个是打开软件主程序,一个是打开用于测试视频的模拟程序。

3视频模拟测试

播放一段视频,使用内置参数进行对目标检测

图 4视频测试

4主程序使用说明

图表 5主程序界面

单击打开程序即打开软件主程序。

4.1采集图像

1.单击打开设备

2.如果要目标检测目标先勾选自动检测

3.如果不需要目标检测则单击开始采集

4.在弹出的窗口中用鼠标框选目标,按空格开始采集目标

4.2舵机控制

1.单击电机连接

2.勾选手动

3.调节所需要的角度

4.单击纵向或横向舵机

4.3线性模组控制

1.单击电机连接

2.勾选手动

3.单击电机启停可以控制移动或停止步进电机的移动

4.单击转向可以改变步进电机的方向

4.4目标检测

1单击打开设备

2勾选自动检测

3单击开始采集

4单击获取hsv

5在弹出的窗口中调节hsv变量使图中只剩目标后按q退出此窗口

6单击停止采集后再单击开始采集

4.4总流程及注意事项

1单击电机连接

2单击打开设备

3勾选自动检测

4单击开始采集

5根据需求是否改变目标参照目标检测说明

6单击电机断开

7单击停止采集

8单机关闭设备

注意事项:

1关闭程序必须点了关闭设备后才能关闭否则再打开程序无法打开设备

2步进或舵机出问题时请立刻单击电机断开可以停止步进电机和初始化舵机

3在正在采集的情况下勾选手动后画面会停止,需要先停止采集再单击采集恢复画面

4.5帮助

在程序运行时可以查看帮助来辅助程序的使用

5源代码

5.1启动器代码

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using CCWin;

namespace bishejiemian

{

public partial class Form1 : CCSkinMain

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

}

private void skinPictureBox2_Click(object sender, EventArgs e)

{

}

private static System.Diagnostics.Process p;

private void skinButton1_Click(object sender, EventArgs e)

{

p = new System.Diagnostics.Process();

p.StartInfo.FileName = "ReadHighCamera.exe";

p.Start();

}

private void skinButton2_Click(object sender, EventArgs e)

{

p = new System.Diagnostics.Process();

p.StartInfo.FileName = "gz.exe";

p.Start();

}

}

}

5.2视频模拟测试代码

#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )

#include lt;opencv2/core/utility.hppgt;

#include lt;opencv2/tracking.hppgt;

#include lt;opencv2/videoio.hppgt;

#include lt;opencv2/highgui.hppgt;

#include lt;iostreamgt;

#include lt;cstringgt;

using namespace std;

using namespace cv;

Rect2d roi;

Mat bgr;

Mat hsv;

Mat image;

Mat qu;

Mat InrangeColor(Point HSV_H, Point HSV_S, Point HSV_V)

{

Mat dst;//色相

int hmin_Max = 360;

int hmax_Max = 360;//饱和度

int smin_Max = 255;

int smax_Max = 255;//亮度

int vmin_Max = 255;

int vmax_Max = 255;

//输出图像分配内存

dst = Mat::zeros(image.size(), CV_32FC3); //掩码

Mat mask;

inRange(hsv, Scalar(HSV_H.x, HSV_S.x / float(smin_Max), HSV_V.x / float(vmin_Max)), Scalar(HSV_H.y, HSV_S.y / float(smax_Max), HSV_V.y / float(vmax_Max)), mask);

//只保留

for (int r = 0; r lt; bgr.rows; r )

{

for (int c = 0; c lt; bgr.cols; c )

{

if (mask.atlt;uchargt;(r, c) == 255)

{

dst.atlt;Vec3fgt;(r, c) = bgr.atlt;Vec3fgt;(r, c);

}

}

}

dst.convertTo(dst, CV_8UC3, 255.0, 0);

return dst;

}

void MoveDetect(Mat temp)

{

Mat imag1 = imread("1.png");

Mat imag2, imag3;

imshow("yuan", imag1);

erode(imag1, imag2, getStructuringElement(MORPH_RECT, Size(7, 7)));

imshow("erode", imag2);

dilate(imag1, imag3, getStructuringElement(MORPH_RECT, Size(7, 7)));

imshow("dilate", imag3);

Mat result = temp.clone();

Mat gray1;

cvtColor(temp, gray1, COLOR_BGR2GRAY); //1.将background和frame转为灰度图

Mat kernel_erode = getStructuringElement(MORPH_RECT, Size(3, 3));

Mat kernel_dilate = getStructuringElement(MORPH_RECT, Size(18, 18));

erode(gray1, gray1, kernel_erode); //2.腐蚀

dilate(gray1, gray1, kernel_dilate); //3.膨胀

//4.查找轮廓并绘制轮廓

vectorlt;vectorlt;Pointgt; gt; contours;

findContours(gray1, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);

//6.查找正外接矩形

vectorlt;Rectgt; boundRect(contours.size());

for (int i = 0; i lt; contours.size(); i )

{

if (contours[i].size() lt;= 200)

continue;

roi=boundRect[i] = boundingRect(contours[i]);

// rectangle(result, boundRect[i], Scalar(0, 255, 0), 2);//在result上绘制正外接矩形

剩余内容已隐藏,请支付后下载全文,论文总字数:35930字

您需要先支付 80元 才能查看全部内容!立即支付

该课题毕业论文、开题报告、外文翻译、程序设计、图纸设计等资料可联系客服协助查找;