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