OpenCV图像扫描原理及imageData概述FAQ

/* 程序名: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图像进行测试。程序运行结果见下图:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值