2016-04-25 18:39:42 zhyh1435589631 阅读数 2773
  • 秒学面向对象视频课程(C++实践篇)视频课程(50课时...

    封装:是指将事物 的特征和行为抽象为一个类。封装实际上是对事物的抽象过程,依据实际应用,按照主观意识将事物的特征和行为描述为类 继承:是指可以从一个类派生一个子类,子类通过继承具有了父类的特征和行为,并且可以在子类中添加自己的特征和行为 多态:是指对于相同的调用或操作,作用于不同的对象,而导致其行为也不同,它增强了软件的灵活性和重要性 有问题咨询老师微信,微信号:mikeshizhanbiao

    24053 人正在学习 去看看 师占标

1. 前言

说明下: matlab 版本实际上和 opencv 版本的思路差不多, 对着改起来应该比较方便, 就不要直接问我要matlab 代码了, 而且你们留个邮箱是几个意思, 受不了了!!!!!!

当时做图像处理大作业的时候, 用的是matlab,因为比较懒就没有使用 opencv 写, 最近突然心血来潮用opencv实现了一下

2. 题目描述

PI05302: Digital Image Processing
Homework #6
Problem 1
用相机自行拍摄一幅图像,编程实现图像边缘检测、图像分割、特征提取以及图
像识别等任务。
拍摄的图像具有下列要求:
1) 图像中需包含学生本人(全身或半身)。
2) 图像中需包含阿拉伯数字标示,比如车牌号、房间号等。
3) 编程处理时,根据情况把图像的大小进行调整,比如 640x480 像素,以加快
图像处理的速度。
用 Matlab 编程,需要实现的具体任务包括:
1) 对图像进行直方图标准化处理,以清晰地表达整幅图像,画出处理结果。
2) 实现整幅图像的边缘检测, 可以看出有肖像画或素描的效果, 画出处理结果。
3) 对具有数字标示的部位进行分割,并把每个字符分割出来,用二值化表示,
画出分割结果。
4) 选取恰当的特征表示对分割的字符提取特征,实现不同字符的识别。如需多
个字符进行训练,请多拍些图像。
[Note]
提交作业的时候文件名按如下格式统一命名: [HW6][编号]学号_姓名
其中编号为在选课系统里该门课选修学生的编号
将作业以附件形式发送电子邮件到 qbhe@ustc.edu.cn, 邮件标题也命名为文件名
格式: [HW6][编号]学号_姓名

3. 处理思路

对于这个问题, 我们基本思路就是, 先通过二值化处理提取 门牌号码信息, 然后通过形态学方法, 分割得到数字, 最后通过相关运算得到识别的字符

4. 处理效果显示及流程

原图
这里写图片描述
灰度化处理
这里写图片描述
提取上半部分区间, 减小处理范围
这里写图片描述
二值化处理
这里写图片描述
提取轮廓信息
这里写图片描述
找到最大符合要求的轮廓
这里写图片描述
抠出数字区域
这里写图片描述
二值化
这里写图片描述
开运算
这里写图片描述
提取外轮廓
这里写图片描述
提取数字信息
这里写图片描述
各个数字抠出
这里写图片描述
这里写图片描述
这里写图片描述
最终识别效果
这里写图片描述

5. code

代码发布到了 csdn 的code 上面了, 第一次用不知道行不行
https://code.csdn.net/zhyh1435589631/opencv_extract_num/tree/master

2019-06-13 17:19:56 qinlele1994 阅读数 173
  • 秒学面向对象视频课程(C++实践篇)视频课程(50课时...

    封装:是指将事物 的特征和行为抽象为一个类。封装实际上是对事物的抽象过程,依据实际应用,按照主观意识将事物的特征和行为描述为类 继承:是指可以从一个类派生一个子类,子类通过继承具有了父类的特征和行为,并且可以在子类中添加自己的特征和行为 多态:是指对于相同的调用或操作,作用于不同的对象,而导致其行为也不同,它增强了软件的灵活性和重要性 有问题咨询老师微信,微信号:mikeshizhanbiao

    24053 人正在学习 去看看 师占标

BRIEF采用二进制码串作为描述子向量,可以利用FAST等算法先检测特征点,然后使用BRIEF去描述

算法过程:

1、使用高斯滤波对图像去噪

2、以特征点为中心,区S*S的领域窗口,在窗口中随机选取一对点,进行像素大小的比较,进行二进制赋值

3、在窗口中随机选取N对特征点,重复2,形成一个二进制编码,这个编码就是对特征点的描述,即特征描述子,一般N=256

配准:

1、每个特征点至此都有一个二进制编码

2、两个特征点编码对应bit位上相同元素的个数小于128的一定不是配对的

3、一幅图像上特征点与另一幅图上特征编码对应bit位上相同元素的个数最多的特征点配成一对

代码:

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/features2d/features2d.hpp>

using namespace std;
using namespace cv;

int main()
{
	Mat Image_1 = imread("2.jpg", 1);
	Mat Image_2 = imread("3.jpg", 1);
	//使用Star检测两幅图像的特征点
	vector<KeyPoint> keypoint_1,keypoint_2;
	StarDetector detector;
	detector.detect(Image_1, keypoint_1);
	detector.detect(Image_2, keypoint_2);

	//描述子
	BriefDescriptorExtractor brief;
	Mat descriptiors_1, descriptiors_2;
	brief.compute(Image_1, keypoint_1, descriptiors_1);
	brief.compute(Image_2, keypoint_2, descriptiors_2);

	//匹配
	BFMatcher matcher(NORM_HAMMING);
	vector<DMatch> matches;
	matcher.match(descriptiors_1, descriptiors_2, matches);
	Mat dst;
	drawMatches(Image_1, keypoint_1, Image_2, keypoint_2,matches,dst);
	imshow("Mathces",dst);
	waitKey(0);
	return 0;
}

效果图:

讲道理,效果很差~~~我几乎找不到配对成功的点,,,,还是我什么地方出错了? 

之后我在前面加上了高斯滤波,效果依然不好~~

2019-11-04 00:09:26 weixin_41205312 阅读数 38
  • 秒学面向对象视频课程(C++实践篇)视频课程(50课时...

    封装:是指将事物 的特征和行为抽象为一个类。封装实际上是对事物的抽象过程,依据实际应用,按照主观意识将事物的特征和行为描述为类 继承:是指可以从一个类派生一个子类,子类通过继承具有了父类的特征和行为,并且可以在子类中添加自己的特征和行为 多态:是指对于相同的调用或操作,作用于不同的对象,而导致其行为也不同,它增强了软件的灵活性和重要性 有问题咨询老师微信,微信号:mikeshizhanbiao

    24053 人正在学习 去看看 师占标

车牌识别的主要流程

本项目是以前做过的一个车辆检测、车流量计数的延伸----识别车牌号码,在此又根据网上资料学习后总结整个车牌识别项目所执行的步骤。在这里插入图片描述车牌识别流程

1 图像预处理

首先采用高斯滤波去除图像中的噪点,将灰度图进行开运算,将较小的连通区域分割开来,将较大的连通区域保存。再将图片进行二值化处理,然后采用Candy边缘检测找到图片的边缘。然后再对边缘检测后的图像进行先闭后开操作使断续的边缘连城一个整体。最后采用轮廓查找的方法找到图片中所有的连通轮廓,车牌的轮廓就在其中。

2 车牌定位

车牌的定位主要是要将前面找到的轮廓进行筛选,找出我们需要的车牌区域,根据实际生活中车牌的特征我们可以依次进行判断。可以根据以下几个特征进行判别:1、轮廓是否为矩形,是否有四个边界。2、轮廓的长宽比是否符合车牌特征,一般的车牌长宽比是在2-4之间,如果车牌倾斜可能会小一点。3、轮廓的主要颜色,目前的车牌主要有蓝牌、黄牌、绿牌、黑牌几种,可以根据轮廓中的颜色分布进行判断。

3 仿射变换对车牌轮廓进行校正

识别到车牌区域后可以计算得到轮廓的四个边和四个顶点,通过计算旋转矩阵将车牌区域校正。
主要步骤如下:
step1 计算车牌轮廓的四个顶点坐标;
step2 计算每个边的长度;
step3 取两个长和宽中的最大值;
step4 将长宽转换到以(0,0)为起始点的新坐标点;
step5 采用cv2.getPerspectiveTransform()函数计算旋转矩阵step6 采用cv2.warpPerspective()函数对车牌区域进行仿射变换,得到校正后的图片。

字符分割

字符分割的主要思路是,基于车牌的二值化结果或边缘提取结果,利用字符的结构特征、字符间的相似性、字符间间隔等信息,一方面把单个字符分别提取出来,也包括粘连和断裂字符等特殊情况的处理;另一方面把宽、高相似的字符归为一类从而去除车牌边框以及一些小的噪声。一般采用的算法有:连通域分析、投影分析,字符聚类和模板匹配等。
本次采用投影的方法分割字符,原理如下:用数组存储车牌区域所有像素值,然后在x轴上遍历每一列的像素值并累加,最终所投影的效果将以投影图的形式呈现,投影图的波峰波谷的差距就是每列累加的像素值的差距。

hog特征提取

step1 首先采用Sobel算子提取图像的X和Y梯度方向特征;
step2 采用傅里叶变换计算幅度和相位;
step3 计算图像梯度特征

SVM训练

采用OpenCV自带的SVM分类器对图像的hog特诊进行训练,其中训练的对象是车牌设计到的文字数据集、字母数据集、数字数据集。

车牌识别

将我们分隔出来的各个字符一次传入模型中进行结果预测。

后记:
1、OCR(光学字符识别)的训练也可以采用神经网络的方法进行训练。
2、此车牌识别对于光线干扰、污点干扰不敏感,会出现难以识别的现象。
3、由于车牌的种类现在比较多,有一些符号在整个车牌照中分为上下两层,这种车牌暂时无法识别。
4、对于背景特别杂乱的情况效果可能不是特别理想。
5、算法的效率暂时还没有得到有效的验证。

参考链接:
https://blog.csdn.net/wzh191920/article/details/79589506(完整的用SVM实现车牌的识别)

2017-05-04 16:30:54 u012150360 阅读数 1976
  • 秒学面向对象视频课程(C++实践篇)视频课程(50课时...

    封装:是指将事物 的特征和行为抽象为一个类。封装实际上是对事物的抽象过程,依据实际应用,按照主观意识将事物的特征和行为描述为类 继承:是指可以从一个类派生一个子类,子类通过继承具有了父类的特征和行为,并且可以在子类中添加自己的特征和行为 多态:是指对于相同的调用或操作,作用于不同的对象,而导致其行为也不同,它增强了软件的灵活性和重要性 有问题咨询老师微信,微信号:mikeshizhanbiao

    24053 人正在学习 去看看 师占标

图像的打开:

import cv2

filename = "/home/vickyleexy/PycharmProjects/33.jpg"
img = cv2.imread(filename)
print type(img),img.shape,img.dtype
cv2.namedWindow("xiamu")
cv2.imshow("xiamu",img)
cv2.waitKey(0)
cv2.destroyAllWindows() #销毁窗口

使用opencv打开图像时报错:
error: /io/opencv/modules/highgui/src/window.cpp:565: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvNamedWindow

但检查发现gtk什么的已经安装了……
解决方法:
sudo apt-get install python-opencv
同时卸载之前安装的opencv-python
sudo pip uninstall opencv-python

opencv安装:
http://www.samontab.com/web/2014/06/installing-opencv-2-4-9-in-ubuntu-14-04-lts/

2018-08-08 14:00:09 qq_41905045 阅读数 115
  • 秒学面向对象视频课程(C++实践篇)视频课程(50课时...

    封装:是指将事物 的特征和行为抽象为一个类。封装实际上是对事物的抽象过程,依据实际应用,按照主观意识将事物的特征和行为描述为类 继承:是指可以从一个类派生一个子类,子类通过继承具有了父类的特征和行为,并且可以在子类中添加自己的特征和行为 多态:是指对于相同的调用或操作,作用于不同的对象,而导致其行为也不同,它增强了软件的灵活性和重要性 有问题咨询老师微信,微信号:mikeshizhanbiao

    24053 人正在学习 去看看 师占标

目标

在这篇文章中,我们将学习

要找到轮廓的不同特征,比如面积,周长,质心,边界框等等

您将看到许多与等高线相关的函数。

1距

图像时刻帮助你计算一些特征比如物体的重心,物体的面积等等。在图像时刻查看维基百科页面

函数cv.moments()给出了计算的所有力矩值的字典。见下文:

import numpy as np
import cv2 as cv

img = cv.imread('wjx.jpg',0)
ret,thresh = cv.threshold(img,127,255,0)
im2,contours,hierarchy = cv.findContours(thresh, 1, 2)

cnt = contours[0]
M = cv.moments(cnt)
print( M )
{'m00': 2.0, 'm10': 912.0, 'm01': 1198.0, 'm20': 415872.3333333333, 'm11': 546288.0, 'm02': 717602.3333333333, 'm30': 189638088.0, 'm21': 249107527.66666666, 'm12': 327226664.0, 'm03': 429844197.0, 'mu20': 0.3333333333139308, 'mu11': 0.0, 'mu02': 0.3333333332557231, 'mu30': 2.9802322387695312e-08, 'mu21': 1.6880221664905548e-09, 'mu12': 3.5390257835388184e-08, 'mu03': 1.1920928955078125e-07, 'nu20': 0.0833333333284827, 'nu11': 0.0, 'nu02': 0.08333333331393078, 'nu30': 5.268356063861754e-09, 'nu21': 2.984029801796697e-10, 'nu12': 6.256172825835833e-09, 'nu03': 2.1073424255447017e-08}
 

 从这一刻起,你就可以提取出有用的数据,比如面积,中心id等等。中心id是由关系给出的,

可以这样做:

cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])

2。轮廓面积

轮廓区域由函数cv.contourArea()或从力矩,M 00'给出。

area = cv.contourArea(cnt)
import numpy as np
import cv2 as cv

img = cv.imread('black.jpg',0)
ret,thresh = cv.threshold(img,127,255,0)
im2,contours,hierarchy = cv.findContours(thresh, 1, 5)


cnt = contours[0]
M = cv.moments(cnt)

area = cv.contourArea(cnt)
print(area)
cv.imshow("img2",img)  

cv.waitKey(0)  
26514.0

 

 

3。轮廓周长

它也被称为弧长。可以通过cv.arcLength()函数找到它。第二个参数指定形状是否是一个封闭的轮廓(如果传递为真),或者仅仅是一条曲线。

perimeter = cv.arcLength(cnt,True)
import numpy as np
import cv2 as cv

img = cv.imread('black.jpg',0)
ret,thresh = cv.threshold(img,127,255,0)
im2,contours,hierarchy = cv.findContours(thresh, 1, 5)


cnt = contours[0]
M = cv.moments(cnt)

perimeter = cv.arcLength(cnt,True)
print(perimeter)
cv.imshow("img2",img)  

cv.waitKey(0)  
1289.4329804182053

 

轮廓近似

它近似于一个轮廓形状到另一个形状,根据我们所指定的精度,它的顶点数较少。它是道格拉斯-peucker算法的实现。检查维基百科页面的算法和演示。

要理解这一点,假设您正在尝试在图像中找到一个正方形,但是由于图像中的一些问题,您没有得到一个完美的正方形,而是一个“坏的形状”(如下面的第一张图所示)。现在你可以用这个函数来近似这个形状。在这个过程中,第二个参数叫做epsilon,它是距离等高线到近似等高线的最大距离。它是一个精度参数。为了得到正确的输出,需要明智地选择epsilon。

epsilon = 0.1*cv.arcLength(cnt,True)
approx = cv.approxPolyDP(cnt,epsilon,True)

在下图中,绿线显示了epsilon=10%弧长的近似曲线。第三张图显示的是相同的弧长。第三个参数指定了曲线是否闭合。

5。凸包

凸壳看起来与等值线近似,但它不是(在某些情况下,两者都可能提供相同的结果)。在这里,cv.凸壳()函数检查凸性缺陷的曲线并修正它。一般来说,凸曲线是总是凸出的曲线,或者至少是平的。如果它在里面膨胀,就叫做凸性缺陷。例如,检查下面的手的图像。红线显示的是手的凸壳。双侧箭头标志着凸性缺陷,即船体与轮廓的最大偏差。

 

 

参数说明:

点是我们传递的轮廓。

船体是输出,通常我们会避开它。

顺时针方向:面向国旗。如果是真的,输出凸壳是顺时针方向的。否则,它是逆时针方向的。

返回点:默认情况下是正确的。然后它返回船体点的坐标。如果是假的,它会返回对应于船体点的等值线的指数。

所以要得到一个凸壳,就像上面的图像一样,下面是充分的:

  •  

 

import numpy as np
import cv2 as cv

img = cv.imread('shou.jpg',0)
ret,thresh = cv.threshold(img,127,255,0)
im2,contours,hierarchy = cv.findContours(thresh, 1, 5)


cnt = contours[0]
M = cv.moments(cnt)
hull = cv.convexHull(cnt)


print(hull )

cv.imshow("img2",img)  

cv.waitKey(0)  

但是如果你想找到凸性缺陷,你需要通过返回点=False。为了理解它,我们将使用上面的矩形图像。首先我发现它的轮廓是cnt。现在我找到了它的凸壳,带着返回点=True,我得到了下面的值:234 202,51 202,51 79,234 79这是矩形的四个角点。如果对returnPoints=False,我得到如下结果:129、67、0、142。这些是等高线的对应点的指数。例如,检查第一个值:cnt 129=234,202,这和第一个结果是一样的(对其他人也是如此)。

当我们讨论凸性缺陷时,你们会再次看到它。

6。检查凸性

有一个函数来检查曲线是否是凸的,cv.iscontour凸()。它只是返回是真还是假。不是一个大问题。

import numpy as np
import cv2 as cv

img = cv.imread('shou.jpg',0)
ret,thresh = cv.threshold(img,127,255,0)
im2,contours,hierarchy = cv.findContours(thresh, 1, 5)


cnt = contours[0]
M = cv.moments(cnt)
k = cv.isContourConvex(cnt)

print(k)

cv.imshow("img2",img)  

cv.waitKey(0)  
================= RESTART: C:\Users\ty\Desktop\qwe\teas11.py =================
False

 

7。边界矩形

有两种类型的边界矩形。

7.。直边界矩形

它是一个直的矩形,它不考虑物体的旋转。所以边界矩形的面积不会是最小的。它是由函数cv.boundingRect()找到的。

让(x,y)是矩形的左上坐标(w,h)是它的宽度和高度。

  • 9。拟合椭圆

    ellipse = cv.fitEllipse(cnt)
    cv.ellipse(img,ellipse,(0,255,0),2)
    import numpy as np
    import cv2 as cv
    
    img = cv.imread('bbwp.png',0)
    ret,thresh = cv.threshold(img,127,255,0)
    im2,contours,hierarchy = cv.findContours(thresh, 1, 5)
    
    
    cnt = contours[0]
    M = cv.moments(cnt)
    ellipse = cv.fitEllipse(cnt)
    cv.ellipse(img,ellipse,(0,255,0),2)
    cv.imshow("img2",img)  
    
    cv.waitKey(0)  
    

     

     

  • 10。拟合直线

  • rows,cols = img.shape[:2]
    [vx,vy,x,y] = cv.fitLine(cnt, cv.DIST_L2,0,0.01,0.01)
    lefty = int((-x*vy/vx) + y)
    righty = int(((cols-x)*vy/vx)+y)
    cv.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)

     

 

没有更多推荐了,返回首页