数字图象处理之二维码图像提取算法(十二)

本文详细探讨了数字图像处理中针对二维码的图像提取算法,适合新年期间的技术分享和学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新年代码大放送:

// test1.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
#include "cvaux.h"
#include "stdio.h"
#pragma comment(lib, "ml.lib")  
#pragma comment(lib, "cv.lib")  
#pragma comment(lib, "cvaux.lib")  
#pragma comment(lib, "cxcore.lib")

//边缘检测
void EdgeTrack(IplImage* src,int threshold1,int threshold2)
{
	IplImage *edge=NULL;
	edge=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);	
	cvCanny(src,edge,threshold1,threshold2,3);   
	//threshold1,threshold2中较小的控制边缘连接,大的控制边缘的初始分割
    cvNamedWindow("canny", CV_WINDOW_AUTOSIZE);
    cvShowImage("canny",edge); 
	cvSaveImage("13.jpg",edge);
    cvWaitKey(0);
	cvDestroyWindow("canny");
	cvReleaseImage(&edge);
}


void move(){
 IplImage* src;
 src=cvLoadImage("11.jpg",0);
 IplImage* dst = cvCreateImage( cvGetSize(src), 8, 1 );//,创建图像头并分配数据;返回矩阵或图像的行数和列数
 IplImage* color_dst = cvCreateImage( cvGetSize(src), 8, 3 );
 CvMemStorage* storage = cvCreateMemStorage(0);//创建一内存块并返回指向块首的指针
 CvSeq* lines = 0;
 int m;
    IplImage* src1=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);//cvsize以像素为单位定义矩形框大小
 
 //  cvCvtColor(src, src1, CV_BGR2GRAY);  
 cvCopy(src,src1);//将数组src(输入数组)复制给src1(输出数组)
 cvCanny( src1, dst, 50, 200, 3 );//采用canny算法寻找输入图像src1的边缘并在输出图形中标志这些边缘;dst表示输出的边缘图像;50,200是阈值
 
 cvCvtColor( dst, color_dst, CV_GRAY2BGR );//进行色彩空间转化,将输入图像color_dst进行色彩空间转换,dst为输出图像
 
 //cvNamedWindow("src",1);
 //cvShowImage("src",dst);
  // cvNamedWindow("dst",1);
 // cvShowImage("dst",dst);
  // cvSaveImage("dst.bmp",dst);
 lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 10, 30, 10 );//利用hough变换在二值图像中寻找直线,dst为输入图像
 //printf("%d\n",lines->total);
 int dis=0;
 int max=0;
 int n=0;
 CvPoint* line;//定义二维整型坐标上的点
 CvPoint pointOne;
 CvPoint pointTwo;
 int a[1003]={0}; //定义数组a,其中元素都为0 
 for( m = 0; m< lines->total; m++ )
 {
  line = (CvPoint*)cvGetSeqElem(lines,m);//返回索引指定的元素指针
  
  dis=(line[1].y-line[0].y)*(line[1].y-line[0].y)+(line[1].x-line[0].x)*(line[1].x-line[0].x);//两点之间的距离;line[1].y为点line[1]的纵坐标,
  a[4*m]=line[0].x;//以下找出两个点
  a[4*m+1]=line[0].y;
  a[4*m+2]=line[1].x;
  a[4*m+3]=line[1].y;
  if(dis>max)
  {
   max=dis;
   n=m;
  }
 cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, 8 );
 }
 pointOne.x=a[4*n];
 pointOne.y=a[4*n+1];
 pointTwo.x=a[4*n+2];
 pointTwo.y=a[4*n+3];
 cvLine( color_dst, pointOne, pointTwo, CV_RGB(0,255,0), 3, 8 );    //画出最长的直线
 
 
 double Angle=0.0;
 
 Angle =-atan2(fabs(pointTwo.y-pointOne.y),fabs(pointTwo.x-pointOne.x));   //得到最长直线与水平夹角,arctan()求解
 
 if(pointTwo.x>pointOne.x && pointTwo.y>pointOne.y)
 {
  Angle=-Angle;
 }
 
 Angle=Angle*180/CV_PI;
 
// cvNamedWindow( "Source", 1 );
 //cvShowImage( "Source", src );
 
cvNamedWindow( "Hough", 1 );
cvShowImage( "Hough", color_dst );
 //cvSaveImage("dst.bmp",dst);

cvWaitKey(0);//以下的内容为旋转,目前的正确率为80%      、、、、、、、、、、图像旋转、、、、、、、、、、、、、、、

 IplImage* src3;
 IplImage* dst3;	
 dst3 = 0;
 src3 = cvLoadImage( "14.jpg" );
	
    int delta = 1;
	double angle=(Angle>=0.0)?Angle-90.0:Angle+90.0;//这里涉及到了角度的选择问题,
  
              int opt = 0;		// 1: 旋转加缩放
			                 	// 0:  仅仅旋转
              double factor;
              dst3 = cvCloneImage (src3);
			  cvNamedWindow ("src3", 1);
			  cvShowImage ("src3", src3);
              for (;;)
				{
					float m[6];
					CvMat M = cvMat (2, 3, CV_32F, m);
					int w = src3->width;
					int h = src3->height;
					if (opt)		// 旋转加缩放
						factor = (cos (angle * CV_PI / 180.) + 1.0) * 2;
					else			//  仅仅旋转
						factor = 1;
					m[0] = (float) (factor * cos (-angle  * CV_PI / 180.));
					m[1] = (float) (factor * sin (-angle  * CV_PI / 180.));
					m[3] = -m[1];
					m[4] = m[0];
					// 将旋转中心移至图像中间
					m[2] = w * 0.5f;
					m[5] = h * 0.5f;
					//  dst(x,y) = A * src(x,y) + b
					cvZero (dst3);
					cvGetQuadrangleSubPix (src3, dst3, &M);
					cvNamedWindow ("dst3", 1);
					cvShowImage ("dst3", dst3);
					cvWaitKey(0);
					//if (cvWaitKey (1) == 27)	//ESC
					//	break;			
				}	
}
int main(int argc, char *argv[])
{
      
        const char * filename = "5.jpg";
       // Matlab风格的cvLoadImage 函数的另一种调用
       IplImage *img = cvLoadImage("5.jpg",1);

       if(!img)//载入失败
       {
              fprintf(stderr,"Can not load image %s /n",filename);
              return -1;
       }
       if(!img->imageData)//载入的图像数据是否正确
       {
              return -1;
       }
 
       cvNamedWindow("image",CV_WINDOW_AUTOSIZE );//创建窗口,窗口名字为image
       cvShowImage("image",img);//在刚创建的image窗口中载入图像

       //创建一个与img相同大小的图像img1
       IplImage *img1 = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);

       //色彩空间转换,将源彩色图像img转化成目标灰色图像imag1
       cvCvtColor(img,img1,CV_BGR2GRAY); //关键
       cvNamedWindow("GrayImage",CV_WINDOW_AUTOSIZE);//创建窗口,窗口名字GrayImage
       cvShowImage("GrayImage",img1);//载入转化后的图像
       cvSaveImage("5_2.jpg",img1);
       cvWaitKey(0);

//========
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值