摘要: 此文原文http://www.cnblogs.com/slysky/archive/2011/10/16/2214015.html#2619948腐蚀 把结构元素B平移a后得到Ba,若Ba包含于X,我们记下这个a点,所有满足上述条件的a点组成的集合称做X被B腐蚀(Erosion)的结果。用公式表示为:E(X)={a| Ba X}=X B,如图1所示。 图1图中X是被处理的对象,B是结构元素。不难知道,对于任意一个在阴影部分的点a,Ba 包含于X,所以X被B腐蚀的结果就是那个阴影部分。阴影部分在X的范围之内,且比X小,就象X被剥掉了... 阅读全文
posted @ 2013-02-27 11:05 ying870510 阅读(8673) 评论(0) 推荐(0) 编辑
摘要: 原文:已经连接不到一、仿射变换 仿射变换的性质:平面上任意两条直线,经仿射变换后,仍然保持平行。仿射变换的功能,是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”(straightness,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(parallelness,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变)。仿射变换可以通过一系列的原子变换的复合来实现,包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。此类变换可以用一个3×3的矩阵来表示,其最后一行为(0 阅读全文
posted @ 2013-02-20 20:07 ying870510 阅读(475) 评论(0) 推荐(0) 编辑
摘要: 本文就是通过opencv中提供的透视变换函数cv::WarpPerspective(),将左边的图像变换为右边的图像原文网址:http://opencv-code.com/tutorials/automatic-perspective-correction-for-quadrilateral-objects/#comment-193 具体流程为:a)载入图像→灰度化→边缘处理得到边缘图像(edge map)cv::Mat im = cv::imread(filename);cv::Mat gray;cvtColor(im,gray,CV_BGR2GRAY);Canny(gray,gray,10 阅读全文
posted @ 2013-01-18 21:58 ying870510 阅读(12696) 评论(5) 推荐(1) 编辑
摘要: opencv中霍夫直线变换可以得到直线上的两个点坐标,两条直线L1<point(x1,y1),point(x2,y2)>与L2<point(x3,y3),point(x4,y4)>,则两条直线的交点为对于求图像的映射时有用 阅读全文
posted @ 2013-01-18 20:20 ying870510 阅读(1055) 评论(0) 推荐(0) 编辑
摘要: point1(x1,y1) A point2(x2,y2) B point3(x3,y3) Ccos(A) = (x2-x1)*(x3-x1) + (y2-y1)*(y3-y1) / sqrt([(x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)]*[(x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)]);在图像处理中检测图形时很有用 阅读全文
posted @ 2013-01-15 22:04 ying870510 阅读(1734) 评论(0) 推荐(0) 编辑
摘要: 下面的算法是稍微有点难度的1、在一个给定的已按升序排列的链表插入一个给定的节点void SortedInsert(LIST**headRef,LIST*newNode){ if(*headRef == 0 || (*headRef)->data >= newNode->data) { newNode->next = *headRef; *headRef = newNode; } else { LIST *current = *headRef; while(current->next != 0 && current->next->data 阅读全文
posted @ 2012-12-27 14:29 ying870510 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 链表是很重要的一种数据结构,又是一种看似简单但很难熟练掌握的东西,究其主要原因应该就是它与指针结合的太紧密了。为了让大家更好的学习,特将一些简单的算法罗列如下,大家一起探讨(用c写的而且是不带头结点的)首先是链表的结构体:typedef struct node{ int data;struct node* next;}LIST;1、往链表中压入元素void Push(LIST **headRef,int newData){ LIST *newNode = new(LIST); newNode->data = newData; newNode->next = *headRef; *h 阅读全文
posted @ 2012-12-27 11:14 ying870510 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 第七章讲的是函数1.函数的参数表中可以有函数中未使用的参数。一般是想用作以后功能的扩充2.静态变量。普通的局部变量当进程达到其定义时就会初始化,也就是在每次调用时均会初始化,且每次调用均会产生一个备份,但static变量只会在进程第一次到达时初始化且仅初始化一次,不会产生多个备份。3.参数传递。参数传递的语义与初始化是语义是一样的,即用实参去初始化形参。当函数调用时如果参数为普通的变量则会给变量分配存储空间并且用实参进行初始化;但当形参是引用或指针时传递的是实参的地址,所以不会另外为参数分配内存空间,但会分配一个指针的空间,想想为什么??传递指针或引用的时候可能会修改所传参数的值所以在传引用或 阅读全文
posted @ 2012-12-12 10:55 ying870510 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 上两天做了一个简单的switch的题目,竟然做错了题目如下:int main(){ int k = 5,n = 0; do { switch(k) { case 1:case 3:n+=1;break; default:n = 0;k--; case 2:case 4:n+=2;k--;break; } cout<<n; } while (k>0&&n<5);}我开始的结果就是0234,但实际结果是2345;我错的原因就是如果没找到匹配项就只想default的执行但没有执行default后面的case语句。switch的执行流程是如果有匹配的case就从 阅读全文
posted @ 2012-11-09 21:21 ying870510 阅读(289) 评论(0) 推荐(0) 编辑