amobbs.com 阿莫电子技术论坛

标题: 我的硕士毕业论文,机器视觉相关,有相机操作、MATLAB和OpenCV图像处理 [打印本页]

作者: asdf1776    时间: 2012-1-4 08:32
标题: 我的硕士毕业论文,机器视觉相关,有相机操作、MATLAB和OpenCV图像处理
很多产品相关的地方语焉不详,不好意思是导师的要求,有的公式经过处理

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

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

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

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

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


用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);
}
作者: asdf1776    时间: 2012-1-4 08:37
利用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);
}
作者: asdf1776    时间: 2012-1-4 08:39
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。
作者: zqy517    时间: 2012-1-4 09:24
很好 很强大!
作者: Dalong357    时间: 2012-1-4 09:45
顶一下
作者: yusufu    时间: 2012-1-4 10:01
顶~~~
作者: lingwuhaidao    时间: 2012-1-4 10:21
mark
作者: zcdz123    时间: 2012-1-4 11:51
mayk
作者: nicksean    时间: 2012-1-4 12:27
mark!
作者: lee345    时间: 2012-1-4 13:55
好,帮顶下
作者: guxingganyue    时间: 2012-1-4 14:12

作者: shh_hqs    时间: 2012-1-5 10:29
只用opencv给学生授课,写写毕业论文.工业控制有实用价值的还是sapera,halcon之类的商业软件.当然要还要有自己的算法.
作者: shloverxp    时间: 2012-1-5 11:16
必须mark,必须THX!
作者: zzt8899    时间: 2012-1-5 11:23
mark
作者: f.luo    时间: 2012-1-6 00:22
不错,Mark。
不过使用映美精的相机。。。
作者: zulu    时间: 2012-2-5 03:08
mark
作者: dingliming    时间: 2012-2-5 06:30
好贴
作者: alg2012    时间: 2012-2-15 22:05
顶!楼主很猛!opencv很有用!
作者: tanxingxiang    时间: 2012-2-16 11:12
mark!
作者: nicksean    时间: 2012-2-16 12:16
mark
作者: lyr0710    时间: 2012-2-28 00:21
楼主大牛
作者: huangstone    时间: 2012-2-28 06:26
这个不错
作者: sufeila    时间: 2012-2-28 07:56
opencv 关注
作者: Nuist_Gwgj    时间: 2012-2-28 08:22
关注
作者: boshi1987    时间: 2012-2-28 08:32
好高级的东东 不懂 呵呵
作者: yuzr    时间: 2012-2-28 09:17
mark
作者: Niandet    时间: 2012-2-28 09:40
MARK!!AND THANKS!
作者: huaixiang    时间: 2012-3-27 18:21
非常有兴趣,最近在研究这方面
作者: ydy65683    时间: 2012-4-25 15:42
mark 感谢!
作者: lwx6    时间: 2012-5-25 14:28
mark
机器视觉相关,有相机操作、MATLAB和OpenCV图像处理
作者: codefish    时间: 2012-5-25 14:51
向楼主学习!
作者: ffbiao    时间: 2012-6-23 12:43
楼主,能否把源码贴上看看?
作者: jesonsyj    时间: 2012-7-6 14:13
厉害啊~
作者: Taylor1    时间: 2013-3-23 15:32
mark opencv by master theme
作者: landmuto    时间: 2013-3-23 19:58
mark 感谢!
作者: jacktau    时间: 2013-3-23 22:05
谢谢共享~~~~~~~~~~~~~
作者: jhxmzx    时间: 2013-4-21 14:16
做图像处理有哪些基础性教材,楼主能不能推荐几本看看
作者: ethan_free    时间: 2013-10-11 08:31
好高级啊,mark
作者: ninghuchong    时间: 2014-3-30 00:28
好东东,mark
作者: D12350    时间: 2015-2-9 13:01
最近在搞机器视觉,学习了
作者: 只为那梦的轮回    时间: 2015-2-10 14:30
帮顶吧!!!
作者: 默默七    时间: 2015-3-2 17:02
mark下,opencv论文
作者: yinqian2015    时间: 2015-4-11 22:08
在搞机器视觉,想用FPGA来做,表示没头绪,看看楼主的帖子,希望有写借鉴
作者: sun92845166    时间: 2015-4-11 22:15
学习一下!
作者: 飘雪    时间: 2015-5-16 01:09
膜拜楼主,大一的表示有兴趣
作者: WOTASOM    时间: 2015-5-16 01:43
强帖要顶!
作者: 纳什    时间: 2016-4-28 16:00
最近刚接触,学习了
作者: qianshan    时间: 2016-5-6 02:13
刚想搞烟雾分析,学习了

作者: tangpeng    时间: 2016-5-12 14:27
留下来  看看
作者: justforfun    时间: 2016-9-11 16:47
用什么嵌入式平台实现的啊?
作者: houyusheng    时间: 2016-9-11 20:07
谢谢分享,关注一下
作者: jagel_huang    时间: 2017-4-14 15:55

顶!
马克

作者: amm    时间: 2017-6-24 14:29
这个不错
作者: klbs    时间: 2017-8-7 11:10
比较详细,谢谢分享
作者: mcuz195    时间: 2017-8-21 17:30
谢谢分享实战经验,值得学习
作者: 疯少爷    时间: 2018-3-20 10:02
谢谢分享,很好的毕设
作者: lidg2014    时间: 2018-4-27 12:37
多谢楼主,很好的资料
作者: hmsfeng    时间: 2018-4-27 16:50
高大上的论文,学习了
作者: mxper88    时间: 2018-5-6 20:57
学习一下
作者: TKZXJ    时间: 2018-12-18 10:53
厉害厉害,学习了




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4