/* 程序名:position.c
功能:从磁盘中读入图像文件,并将图像显示在屏幕上,获取四个顶点坐标
*/
#include "cxcore.h"
#include <stdio.h>
#include "cv.h" /*OpenCV的基本函数头文件*/
#include "highgui.h" /* OpenCV的图像显示函数头文件*/
#include "iostream"
using namespace std;
//*********************************************************
//图像处理函数cvLineVertical,得到两对角坐标并画对角线
//*********************************************************
void cvLineVertical(IplImage *image,IplImage *image_src)
{
IplImage *image1=image;
int a[8];//存储四个顶点坐标的信息
int flag1=1;//均为标志位
int flag2=1;
int flag3=1;
int flag4=1;
cvGetSize(image1);
cout<<"image->height:"<<image1->height<<endl;
cout<<"image->width:"<<image1->width<<endl;
for(int i=0;i<image1->height;i++)
for(int j=0;j<image1->width;j++)//先实现行扫描,再实现列扫描
{
if(((uchar*)( image->imageData + image->widthStep*i))[j]==255&&flag1)//j为x轴坐标,i为y轴坐标
{
flag1=0;
a[0]=j;
a[1]=i;
cout<<"("<<a[0]<<","<<a[1]<<",)"<<endl;
}
}
for(int i=image1->height-1;i>0;i--)
for(int j=0;j<image1->width;j++)
{
if(((uchar*)( image->imageData + image->widthStep*i))[j]==255&&flag2)
{
flag2=0;
a[2]=j;
a[3]=i;
cout<<"("<<a[2]<<","<<a[3]<<")"<<endl;
}
}
for(int j=0;j<image1->width;j++)
for(int i=0;i<image1->height;i++)//先实现列扫描,在实现行扫描
{
if(((uchar*)( image->imageData + image->widthStep*i))[j]==255&&flag3)//j为x轴坐标,i为y轴坐标
{
flag3=0;
a[4]=j;
a[5]=i;
cout<<"("<<a[4]<<","<<a[5]<<")"<<endl;
}
}
for(int j=image1->width-1;j>0;j--)
for(int i=0;i<image1->height;i++)
{
if(((uchar*)( image->imageData + image->widthStep*i))[j]==255&&flag4)
{
flag4=0;
a[6]=j;
a[7]=i;
cout<<"("<<a[6]<<","<<a[7]<<")"<<endl;
}
}
cvLine( image_src, cvPoint(a[0],a[1]), cvPoint(a[2],a[3]),CV_RGB(255,0,0), 1, CV_AA, 0 );
cvLine( image_src, cvPoint(a[4],a[5]), cvPoint(a[6],a[7]),CV_RGB(255,0,0), 1, CV_AA, 0 );
}
//*************************************************************
int main()
{
IplImage * src_Img=NULL;
src_Img=cvLoadImage("F:\\test\\position\\lena.jpg",1);//-1 代表不变,1代表bgr
if(!src_Img)
return -1;
IplImage * edge_Img=cvCreateImage(cvGetSize(src_Img),IPL_DEPTH_8U,1);
IplImage * temp_Img=cvCreateImage(cvGetSize(src_Img),IPL_DEPTH_8U,1);
cvCvtColor(src_Img,temp_Img,CV_BGR2GRAY);//转为灰阶 temp_Img
cvCanny(temp_Img,edge_Img,50,100);//边缘检测
cvNamedWindow("show",CV_WINDOW_AUTOSIZE);
cvShowImage("show",edge_Img);
cvLineVertical(edge_Img,src_Img);//抓取四角关键点
cvNamedWindow("show1",CV_WINDOW_AUTOSIZE);
cvShowImage("show1",src_Img);
while(1)
{ char c=cvWaitKey(33);
if(c==27) break;
}
cvReleaseImage(&src_Img);
cvDestroyWindow("show");
cvReleaseImage(&edge_Img);
cvDestroyWindow("show1");
}
在本例中,图像的顶点坐标为左上角,由于图像规则,所以用这幅lena.jpg图像进行测试。程序运行结果见下图: