新年代码大放送:
// 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);
//========