2017-08-31 11:39:12 u013972657 阅读数 3039
  • 3D图形理论

    课程实现一套软3D,即不依赖任何第三方API(OpenGL,D3D,GDI)等。 课程从建立建立颜色缓冲区,绘制点,绘制线,绘制面,绘制图片,建立纹理,作图形的旋转,图像的混合,建立三维坐标系,实现模型矩阵,投影矩阵,观察矩阵,深度缓冲区等三维核心功能,实现基本的OpenGL核心绘制功能,让开发者从底层,全面的认识3D,为优化,开发出更好的游戏奠定基础。

    19515 人正在学习 去看看 张立铜

          以下是我对投影法的一点认识和实验:

投影法就是数字图像在某个方向上进行像素累加。通过水平和垂直方向的投影,可以得到表格图像投影的几个特点:

(1)表格区域的水平与竖直投影分布通常出现周期性的尖峰

(2)在文字投影的行与行之间或列与列之间常会出现明显的空白区

            因此,求图像水平以及竖直投影,根据特点分别设以阈值就可以将横线以及竖直线所在位置确定。

  第一步:求图像的水平投影、竖直投影

  第二步:设定合理阈值,求取大于阈值的坐标(水平投影记录纵坐标,垂直投影记录横坐标)

  第三步:根据记录纵坐标恢复水平线,根据记录横坐标恢复竖直线。

            下面附整体代码以及实验结果:

#include<iostream>  
#include<vector>
#include <cv.h>  
#include <highgui.h>
using namespace std;
using namespace cv;
Mat VerticalLine(Mat srcImageBin)//垂直线条检测 
{

	vector <int> array;//动态数组用来存储投影值大于阈值的横坐标
	
	int *colswidth = new int[srcImageBin.cols];  //申请src.image.cols个int型的内存空间,存储二值图中每列的白色像素数  
	memset(colswidth, 0, srcImageBin.cols * 4);  //数组必须赋初值为零,否则出错。无法遍历数组。  

	int value;
	for (int i = 0; i < srcImageBin.cols; i++)
	{

		for (int j = 0; j < srcImageBin.rows; j++)
		{
			value = srcImageBin.at<uchar>(j, i);

			if (value == 255)
			{
				colswidth[i]++; //统计每列的白色像素点   

			}

		}
	
	}
	
	Mat lineImage(srcImageBin.rows, srcImageBin.cols, CV_8UC1, cv::Scalar(0, 0, 0));

        //寻找投影大于阈值0.3*srcImageBin.rows的横坐标
	for (int i = 0; i < srcImageBin.cols; i++)
	{
		bool flag = true;

		for (int j = 0; j < colswidth[i] && colswidth[i] >= (0.3*srcImageBin.rows); j++)
		{
			
			if (flag == true)
			{
				array.push_back(i);
				flag = false;
			}
		}
	}
	int count = array.size();
        //恢复直线
	for (int n = 0; n < srcImageBin.rows; n++)
	{
		for (int w = 0; w<count; w++)
		{
			if (srcImageBin.at<uchar>(n, array[w]) == 255)
			{
				lineImage.at<uchar>(n, array[w]) = 255;
			}
		
		}
	}

	
	
	delete[] colswidth;
	return lineImage;
}
Mat HorizonLine(Mat srcImageBin)//水平线条检测
{
	vector <int> array1;
	
	int *rowswidth = new int[srcImageBin.rows];  
	memset(rowswidth, 0, srcImageBin.rows * 4);    
	int value;
	for (int i = 0; i < srcImageBin.rows; i++)
	{
		for (int j = 0; j < srcImageBin.cols; j++)
		{
			value = srcImageBin.at<uchar>(i, j);
			if (value == 255)
			{
				rowswidth[i]++; //统计每行的白色像素点    
			}
		}

	}
	
	Mat lineImage(srcImageBin.rows, srcImageBin.cols, CV_8UC1, cv::Scalar(0, 0, 0));
	
        //寻找投影大于阈值0.525*srcImageBin.cols的纵坐标
	for (int i = 0; i < srcImageBin.rows; i++)
	{
		bool flag = true;
		for (int j = 0; j < rowswidth[i] && rowswidth[i] >= (0.525*srcImageBin.cols); j++)
		{
			if (flag == true)
			{
				array1.push_back(i);
				flag = false;
			}

		}
	}
	int count = array1.size();

        //恢复水平线
	for (int h = 0; h<count; h++)
	{
		for (int m = 0; m < srcImageBin.cols; m++)
		{
			if (srcImageBin.at<uchar>(array1[h], m) == 255)
			{
				lineImage.at<uchar>(array1[h], m) = 255;
			}

		}
	}
	
	
	delete[] rowswidth;//释放前面申请的空间  
	return lineImage;
}
int main()
{
	Mat srcImage = imread("E:\\x.jpg");
	Mat closeimage;
	imshow("原图", srcImage);
	if (srcImage.channels() > 1)
		cvtColor(srcImage, srcImage, CV_RGB2GRAY);
	Mat srcImageBin;
	threshold(srcImage, srcImageBin, 140, 255, CV_THRESH_OTSU | CV_THRESH_BINARY_INV);
	
	Mat VP;
	VP = VerticalLine(srcImageBin);
	
	Mat HP;
	HP = HorizonLine(srcImageBin);
	
	Mat mergelineImage;
	
	bitwise_or(HP, VP, mergelineImage);
	imshow("mergelineImage", mergelineImage);
	
	waitKey(0);
	return 0;

}
实验结果如下:

              由上结果可知,如果直线中间有字会被误检为直线,图中用红色椭圆标出。

              文中若有错误的不妥的地方,还望指出,以便共同学习。

2018-12-05 17:14:23 weixin_43958974 阅读数 2056
  • 3D图形理论

    课程实现一套软3D,即不依赖任何第三方API(OpenGL,D3D,GDI)等。 课程从建立建立颜色缓冲区,绘制点,绘制线,绘制面,绘制图片,建立纹理,作图形的旋转,图像的混合,建立三维坐标系,实现模型矩阵,投影矩阵,观察矩阵,深度缓冲区等三维核心功能,实现基本的OpenGL核心绘制功能,让开发者从底层,全面的认识3D,为优化,开发出更好的游戏奠定基础。

    19515 人正在学习 去看看 张立铜

水平灰度投影是指二维图像按列向x轴方向投影;
垂直灰度投影是指二维图象按行向y轴方向投影;
投影的结果可以看成是一维图像(一维数组)
MATLAB代码如下:

clear all
clc
%--- 从任意文件夹中读取图像
[fn,pn,fi] = uigetfile('*.jpg','请选择所要识别的图片');% 可以任意更改其他格式
% fn表示图片的名字,pn表示图片的路径,fi表示选择的文件类型
I = imread([pn fn]); % 读取图像参数为图像名称和图像路径
I = rgb2gray(I);  % 对图像进行灰度处理,若是,可跳过
[m n]=size(I); % m n分别为图像的行 列数
%--- 进行垂直灰度投影
for y=1:n
     V(y)=sum(I(1:m,y));
end
y=1:n;
figure
subplot(211), plot(y,V(y));
title('垂直灰度投影');
% 进行水平灰度投影
for x=1:m
    L(x)=sum(I(x,:));
end
x=1:m;
subplot(212),plot(x,L(x));
title('水平灰度投影'); 
2010-09-04 22:24:00 tlovet1314 阅读数 2553
  • 3D图形理论

    课程实现一套软3D,即不依赖任何第三方API(OpenGL,D3D,GDI)等。 课程从建立建立颜色缓冲区,绘制点,绘制线,绘制面,绘制图片,建立纹理,作图形的旋转,图像的混合,建立三维坐标系,实现模型矩阵,投影矩阵,观察矩阵,深度缓冲区等三维核心功能,实现基本的OpenGL核心绘制功能,让开发者从底层,全面的认识3D,为优化,开发出更好的游戏奠定基础。

    19515 人正在学习 去看看 张立铜

 利用电脑来实现图像识别和分割是非常困难的,人脑可以从很复杂的景物中分开并识别每个物体,甚至可以毫不费力地跟上每秒好几十帧变化的图象。而对于计算机来说,要达到人脑的识别水平是相当困难。因为实现复杂,这里只是一些最基本,最简单的算法和思想,针对也只能是一些具体(而不是通用)的应用。算法共有三个:投影法、差影法和模板匹配。

 

8.1 投影法

1.定义:投影法结果类似于灰度直方图,通过垂直或水平投影确定识别目标的垂直或水平位置。

 

2.实现方法:

1)去除噪声(由于噪声点对投影有一定的影响,所以处理前最好先做一次平滑)。

2)将图像进行阈值化(为了使处理想过更好);

3)二值化(方便后期统计处理);

4)做垂直或水平投影(统计每行(或每列)白点(或黑点)的个数,再形成相应的直方图)。

 

8.2 差影法

差影法的原理非常简单:将前后两幅图象相减,得到的差作为结果结果图象。差影法是非常有用的,可以用在监控系统中,电影“阿甘正传”特技中应用了“蓝幕”技术,其实也包含了差影法的原理。

 

8.3 模板匹配

所谓模板匹配,其实想法很简单:拿已知的模板(在本例中为足球的图象),和原图象中同样大小的一块区域去对,可以用平方误差之和来衡量原图中的块和模板之间的差别。

因为需要一个个象素的平移和匹配,所以运算量相当庞大

 

呵呵~ 好像习惯了每章内容都写一点感想!这章内容虽然电子书上介绍的很少,但深刻感受到,这部分的内容有很多,也有专门的学派在研究图像识别。以前经常在电视上看到很多关于图像识别的技术,都挺感兴趣的,不过真要深究这方面的话,还是比较麻烦的!涉及的算法太多。。。

9号就开学了,还剩两章内容没有看,得加油啦!

   

    每个人不同,所以每个人的路不同。对于不同人来说,成功的终点也会不同,所以只要朝着自己的方向,用自己的方法去活者就好,每天多努力一点。。。

2014-06-14 19:38:56 kenthomsen 阅读数 384
  • 3D图形理论

    课程实现一套软3D,即不依赖任何第三方API(OpenGL,D3D,GDI)等。 课程从建立建立颜色缓冲区,绘制点,绘制线,绘制面,绘制图片,建立纹理,作图形的旋转,图像的混合,建立三维坐标系,实现模型矩阵,投影矩阵,观察矩阵,深度缓冲区等三维核心功能,实现基本的OpenGL核心绘制功能,让开发者从底层,全面的认识3D,为优化,开发出更好的游戏奠定基础。

    19515 人正在学习 去看看 张立铜

实现场景:

 

 _____________前端(摄像头+相关设备)____识别后通过网络上传______系统中心

 

整个过程:

1.抓到车(需解决:车辆检测技术,拍照技术)

2.找到车牌区域  (先初步定位,后精准定位)

3.车牌定位

4.车牌预处理 (车牌先灰度化,二值化,去噪(滤波))

5.字符分割 (垂直投影法,模板匹配法)

6.字符识别 (字典,图像识别,基于神经网络识别)

7.获取车牌号等信息后打包上传(车牌,车型,车身,车速等)

 

 应用:电子警察,套牌车查询,查案(多区域碰撞分析),流量统计,布控,黑名单,查车轨迹等

 

笔记

阅读数 948

3D图象算法(转)

阅读数 3901

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