首页 > 代码库 > opencv_将图像上的4个点按逆时针排序

opencv_将图像上的4个点按逆时针排序

1:代码如下:

#include "stdafx.h"#include "cxcore.h"#include "cvcam.h"#include "windows.h"#include "cv.h"#include "highgui.h"#include "iostream"using namespace std;CvMat* RankPoint(CvMat* p);/*输出矩阵*/void PrintMat2(CvMat*target, char * name)//第一个参数为cvMat矩阵指针,第二个参数为输出的矩阵的名字{    printf("%s:\n", name);    for (int i=0; i<target->rows; i++)    {        for (int j=0; j<target->cols;j++)        {            printf("%f\t", cvmGet(target, i,j));        }        printf("\n");    }}CvMat* RankPoint(CvMat* p){    CvMat* p_dst=cvCreateMat(3,4,CV_32FC1);//图像上点的矩阵,竖着依次为u,v,1    double a[2][4];    a[0][0]=cvmGet(p,0,0); a[0][1]=cvmGet(p,0,1); a[0][2]=cvmGet(p,0,2); a[0][3]=cvmGet(p,0,3);    a[1][0]=cvmGet(p,1,0); a[1][1]=cvmGet(p,1,1); a[1][2]=cvmGet(p,1,2); a[1][3]=cvmGet(p,1,3);    //cout<<a[0][2]<<endl;    double b;    for(int j=4;j>0;j--)    {        for(int i=0;i<j;i++)        {            if(a[0][i]>=a[0][i+1])            {                b=a[0][i];                a[0][i]=a[0][i+1];                a[0][i+1]=b;                b=a[1][i];                a[1][i]=a[1][i+1];                a[1][i+1]=b;            }        }    }    for(int i=0;i<4;i=i+2)    {        if(a[1][i]>=a[1][i+1])        {            b=a[0][i];            a[0][i]=a[0][i+1];            a[0][i+1]=b;            b=a[1][i];            a[1][i]=a[1][i+1];            a[1][i+1]=b;        }    }    cvmSet(p_dst,0,0,a[0][1]); cvmSet(p_dst,0,1,a[0][3]); cvmSet(p_dst,0,2,a[0][2]); cvmSet(p_dst,0,3,a[0][0]);    cvmSet(p_dst,1,0,a[1][1]); cvmSet(p_dst,1,1,a[1][3]); cvmSet(p_dst,1,2,a[1][2]); cvmSet(p_dst,1,3,a[1][0]);    cvmSet(p_dst,2,0,1);       cvmSet(p_dst,2,1,1);       cvmSet(p_dst,2,2,1);       cvmSet(p_dst,2,3,1);    return p_dst;    /*------释放内存------*/    cvReleaseMat(&p_dst);    /*------------*/}int main(){    CvMat* p_callback_circle=cvCreateMat(3,4,CV_32FC1);//图像上点的矩阵,竖着依次为u,v,1    cvmSet(p_callback_circle,0,0,11); cvmSet(p_callback_circle,0,1,50); cvmSet(p_callback_circle,0,2,60); cvmSet(p_callback_circle,0,3,10);    cvmSet(p_callback_circle,1,0,61); cvmSet(p_callback_circle,1,1,23); cvmSet(p_callback_circle,1,2,55); cvmSet(p_callback_circle,1,3,20);    cvmSet(p_callback_circle,2,0,1);  cvmSet(p_callback_circle,2,1,1);  cvmSet(p_callback_circle,2,2,1);  cvmSet(p_callback_circle,2,3,1);    PrintMat2(p_callback_circle, "p_callback_circle");    CvMat* p_dst_callback_circle=cvCreateMat(3,4,CV_32FC1);//图像上点的矩阵,竖着依次为u,v,1    p_dst_callback_circle=RankPoint(p_callback_circle);    PrintMat2(p_dst_callback_circle, "p_dst_callback_circle");    return 0;}

 

运行结果:

技术分享

opencv_将图像上的4个点按逆时针排序