amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 10277|回复: 61
打印 上一主题 下一主题

我的硕士毕业论文,机器视觉相关,有相机操作、MATLAB和OpenCV图像处理

  [复制链接]
跳转到指定楼层
1
发表于 2012-1-4 08:32:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
很多产品相关的地方语焉不详,不好意思是导师的要求,有的公式经过处理

不过有的技术细节反而是可以详细说说的,比如MATLAB和OpenCV的图像处理,比如MATLAB+OpenCV+VC的联合编程,比如映美精相机的操作

OpenCV我用的比较熟,这个工具非常好用

论文题目:
《卷烟纸罗纹强度检测方法研究与系统设计》

该系统除了机械部分,其他都是我做的

点击此处下载 ourdev_710162K0VQX9.pdf(文件大小:16.88M) (原文件名:卷烟纸罗纹强度检测方法研究与系统设计.pdf)
2
 楼主| 发表于 2012-1-4 08:36:31 | 只看该作者
有的技术细节论文里没写,这里小小补充一下,直上代码!:


用OpenCV求解最大连通域




本程序的主要结构是:
1.读彩色bmp文件,提取Green通道
2.中值滤波,Otsu二值化
3.形态学操作去除小细节
4.标注连通域
5.求解最大连通域


#include <cv.h>
#include <highgui.h>
#include <cxcore.h>
#include <vector>
#include <algorithm>
using namespace std;

///////////////////////////////////////////////

void CMy20111114qian的matlab程序转opencvDlg::OnBnClickedButton1()
{
    IplImage *src = cvLoadImage("before.bmp", CV_LOAD_IMAGE_COLOR);//读取图像文件

    cvNamedWindow("origin");
    cvShowImage("origin", src);//显示原始图像

    //摄像机保存的图像是32位的,有R、G、B和Alpha通道
    //图像中实际存储顺序是B、G、R
    IplImage *blue    = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//制作一个单通道图像
    IplImage *green = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//制作一个单通道图像
    IplImage *red    = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//制作一个单通道图像

    cvSplit(src, blue, green, red, NULL);//分割颜色通道

    cvSmooth(green, green, CV_MEDIAN, 7);//7*7中值滤波

    cvThreshold(green, green, 0.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU);// OTSU法二值化

    {
        IplConvKernel *element  
            = cvCreateStructuringElementEx(5, 5, 0, 0, CV_SHAPE_ELLIPSE);//定义形态学结构指针

        cvMorphologyEx(green, green, NULL, element, CV_MOP_OPEN);//开运算,去除比结构元素小的亮点

        cvReleaseStructuringElement(&element);
    }

    cvNamedWindow("binary");
    cvShowImage("binary", green);//显示二值化图像

    {
        int color = 254;// 从254开始,因此连通域不能多于253个

        CvSize sz = cvGetSize(green);
        int w;
        int h;

        for (w=0; w<sz.width; w++)
        {
            for (h=0; h<sz.height; h++)
            {
                if (color > 0)
                {
                    if (CV_IMAGE_ELEM(green, unsigned char, h, w) == 255)
                    {
                        cvFloodFill(green, cvPoint(w,h), CV_RGB( color,color,color));//把各连通域标记上颜色
                        color--;
                    }
                }
            }
        }

        cvNamedWindow("labeled");
        cvShowImage("labeled", green);//显示标记后的图像

        int colorsum[255] = {0};
        for (w=0; w<sz.width; w++)
        {
            for (h=0; h<sz.height; h++)
            {
                if (CV_IMAGE_ELEM(green, unsigned char, h, w) > 0)//不对0值计数,不可能为255
                {
                    colorsum[CV_IMAGE_ELEM(green, unsigned char, h, w)]++;//统计每种颜色的数量
                }
            }
        }

        vector<int> v1(colorsum, colorsum+255);//用数组初始化vector
        int maxcolorsum = max_element(v1.begin(), v1.end()) - v1.begin();//求出最多数量的颜色

        for (w=0; w<sz.width; w++)
        {
            for (h=0; h<sz.height; h++)
            {
                if (CV_IMAGE_ELEM(green, unsigned char, h, w) == maxcolorsum)
                {
                    CV_IMAGE_ELEM(green, unsigned char, h, w) = 255;//只把最多数量的颜色标为255
                }
                else
                {
                    CV_IMAGE_ELEM(green, unsigned char, h, w) = 0;//其他标为0
                }
            }
        }

        cvNamedWindow("最大连通域");
        cvShowImage("最大连通域", green);//显示最大连通域
    }

    cvReleaseImage(&src);
    cvReleaseImage(&blue);
    cvReleaseImage(&green);
    cvReleaseImage(&red);
}
3
 楼主| 发表于 2012-1-4 08:37:34 | 只看该作者
利用OpenCV进行邻域平均





在数据采集系统中,对采集到的数据进行平滑处理是一种很常用的操作,一般是设置一 个滑动窗口,对该窗口中的数据去除最大值和最小值,将剩下的值取平均值

在这里我们就不用自己编写邻域平均程序了,直接采用OpenCV中提供的函数,尽量利用 已有的资源,把不可避免的编程工作降到最低

使用cvSmooth函数,可选择高斯平滑、邻域平均、中值平滑等
若是使用Filter2D函数,还可以自定义平滑方式,例如设定核函数可以实现如下功能:
x = double(8*x + 4*x[i-1] + 2*x[i-2] + x[i-3])/(8+4+2+1)

以下程序中,q1是原始数据,q2是邻域平均后的数据:

/////////////////////////////////////////////////

#include <deque>
using namespace std;
deque<float> q1(600);//原始数据,十分钟
deque<float> q2(600);//邻域平均后的数据


void CMy20111116_PCR曲线绘制Dlg::OnBnClickedButton2()
{
    int n = GetDlgItemInt(IDC_EDIT1);//几点平滑

    CvMat* mat = cvCreateMat(1, 600, CV_32FC1);

    for (int i=0; i<600; i++)
    {
        cvmSet(mat, 0, i, q1);
    }

    cvSmooth(mat, mat, CV_BLUR, n);

    for (int i=0; i<600; i++)
    {
        q2.pop_front();
        q2.push_back(cvmGet(mat, 0, i));
    }

    cvReleaseMat(&mat);
}
4
 楼主| 发表于 2012-1-4 08:39:15 | 只看该作者
VC + OpenCV + MATLAB 联合编程






使用的软件版本分别是:Visual C++ 2005、OpenCV 2.0、MATLAB2009a。
  
假设我们已经有了一个封装好的调用MATLAB中函数的函数(请自行上网搜索MATLAB与VC联合编程的文章):
double MATLAB_myfunc1(double * matrix, int row, int col)
函数中的参数分别代表数据块起始地址、行、列。
  
OpenCV及MATLAB编程的细节这里就省略不写了,在VC中调用OpenCV再调用MATLAB函数的用法如下:
  
IplImage *iplgray = cvCreateImage(cvSize(Width,Height),IPL_DEPTH_8U,1);   //创建8bit灰度图像
...//读取图像放入iplgray
IplImage *iplgraydouble = cvCreateImage(cvSize(Width,Height),IPL_DEPTH_64F,1);  //创建双精度矩阵,因为我们的MATLAB函数的参数是double型矩阵
cvConvert(iplgray,iplgraydouble);   // 类型转换
IplImage *iplgraydoubletranspose = cvCreateImage(cvSize(Height,Width),IPL_DEPTH_64F,1);   // 用于存放转置后的矩阵,注意高宽参数
cvTranspose(iplgraydouble,iplgraydoubletranspose);   // 矩阵转置,因为在OpenCV中矩阵数据按行存储,而MATLAB中是按列存储
double dd = MATLAB_myfunc1((double*)iplgraydoubletranspose->imageData,
iplgraydoubletranspose->height,iplgraydoubletranspose->width);   // 调用
MATLAB中编写的函数

  
最需要注意的就是OpenCV和MATLAB中数据存储的方向不同。

为什么要联合编程呢,因为有的操作在MATLAB中很容易实现,在OpenCV或VC里却要花很
大篇幅,这样联合调用的话就省事多了。
  
但是也有缺点,MATLAB调用很慢,而且电脑上需要安装了对应版本的MATLAB,因此推荐
这种联合调用的方法用于算法的研究阶段,制作最终程序时还是建议用OpenCV或VC。
5
发表于 2012-1-4 09:24:33 | 只看该作者
很好 很强大!
6
发表于 2012-1-4 09:45:36 | 只看该作者
顶一下
7
发表于 2012-1-4 10:01:51 | 只看该作者
顶~~~
8
发表于 2012-1-4 10:21:22 | 只看该作者
mark
9
发表于 2012-1-4 11:51:04 | 只看该作者
mayk
10
发表于 2012-1-4 12:27:04 | 只看该作者
mark!
11
发表于 2012-1-4 13:55:20 | 只看该作者
好,帮顶下
12
发表于 2012-1-4 14:12:40 | 只看该作者
13
发表于 2012-1-5 10:29:28 | 只看该作者
只用opencv给学生授课,写写毕业论文.工业控制有实用价值的还是sapera,halcon之类的商业软件.当然要还要有自己的算法.
14
发表于 2012-1-5 11:16:10 | 只看该作者
必须mark,必须THX!
15
发表于 2012-1-5 11:23:38 | 只看该作者
mark
16
发表于 2012-1-6 00:22:03 | 只看该作者
不错,Mark。
不过使用映美精的相机。。。
17
发表于 2012-2-5 03:08:20 | 只看该作者
mark
18
发表于 2012-2-5 06:30:03 | 只看该作者
好贴
19
发表于 2012-2-15 22:05:33 | 只看该作者
顶!楼主很猛!opencv很有用!
20
发表于 2012-2-16 11:12:26 | 只看该作者
mark!
21
发表于 2012-2-16 12:16:14 | 只看该作者
mark
23
发表于 2012-2-28 00:21:36 | 只看该作者
楼主大牛
24
发表于 2012-2-28 06:26:33 | 只看该作者
这个不错
25
发表于 2012-2-28 07:56:55 | 只看该作者
opencv 关注
26
发表于 2012-2-28 08:22:18 | 只看该作者
关注
27
发表于 2012-2-28 08:32:58 | 只看该作者
好高级的东东 不懂 呵呵
28
发表于 2012-2-28 09:17:09 | 只看该作者
mark
29
发表于 2012-2-28 09:40:54 | 只看该作者
MARK!!AND THANKS!
30
发表于 2012-3-27 18:21:53 | 只看该作者
非常有兴趣,最近在研究这方面
31
发表于 2012-4-25 15:42:39 | 只看该作者
mark 感谢!
32
发表于 2012-5-25 14:28:46 | 只看该作者
mark
机器视觉相关,有相机操作、MATLAB和OpenCV图像处理
33
发表于 2012-5-25 14:51:42 | 只看该作者
向楼主学习!
34
发表于 2012-6-23 12:43:34 | 只看该作者
楼主,能否把源码贴上看看?
35
发表于 2012-7-6 14:13:12 | 只看该作者
厉害啊~
36
发表于 2013-3-23 15:32:03 | 只看该作者
mark opencv by master theme
37
发表于 2013-3-23 19:58:19 | 只看该作者
mark 感谢!
38
发表于 2013-3-23 22:05:13 | 只看该作者
谢谢共享~~~~~~~~~~~~~
39
发表于 2013-4-21 14:16:53 | 只看该作者
做图像处理有哪些基础性教材,楼主能不能推荐几本看看
40
发表于 2013-10-11 08:31:26 | 只看该作者
好高级啊,mark
41
发表于 2014-3-30 00:28:22 | 只看该作者
好东东,mark
42
发表于 2015-2-9 13:01:59 | 只看该作者
最近在搞机器视觉,学习了
43
发表于 2015-2-10 14:30:25 | 只看该作者
帮顶吧!!!
44
发表于 2015-3-2 17:02:58 | 只看该作者
mark下,opencv论文
45
发表于 2015-4-11 22:08:55 | 只看该作者
在搞机器视觉,想用FPGA来做,表示没头绪,看看楼主的帖子,希望有写借鉴
46
发表于 2015-4-11 22:15:39 | 只看该作者
学习一下!
47
发表于 2015-5-16 01:09:36 | 只看该作者
膜拜楼主,大一的表示有兴趣
48
发表于 2015-5-16 01:43:32 | 只看该作者
强帖要顶!
49
发表于 2016-4-28 16:00:18 | 只看该作者
最近刚接触,学习了
50
发表于 2016-5-6 02:13:12 | 只看该作者
刚想搞烟雾分析,学习了
51
发表于 2016-5-12 14:27:22 | 只看该作者
留下来  看看
52
发表于 2016-9-11 16:47:46 | 只看该作者
用什么嵌入式平台实现的啊?
53
发表于 2016-9-11 20:07:09 | 只看该作者
谢谢分享,关注一下
54
发表于 2017-4-14 15:55:49 | 只看该作者

顶!
马克
55
发表于 2017-6-24 14:29:19 | 只看该作者
这个不错
56
发表于 2017-8-7 11:10:31 | 只看该作者
比较详细,谢谢分享
57
发表于 2017-8-21 17:30:00 | 只看该作者
谢谢分享实战经验,值得学习
58
发表于 2018-3-20 10:02:23 来自手机 | 只看该作者
谢谢分享,很好的毕设
59
发表于 2018-4-27 12:37:08 | 只看该作者
多谢楼主,很好的资料
60
发表于 2018-4-27 16:50:50 | 只看该作者
高大上的论文,学习了
61
发表于 2018-5-6 20:57:37 | 只看该作者
学习一下
62
发表于 2018-12-18 10:53:27 | 只看该作者
厉害厉害,学习了
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2020-2-28 17:00

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表