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:
", name);
    for (int i=0; i<target->rows; i++)
    {
        for (int j=0; j<target->cols;j++)
        {
            printf("%f	", cvmGet(target, i,j));
        }
        printf("
");
    }
}
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=3;j>1;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;
}

运行结果:

原文地址:https://www.cnblogs.com/lovemi93/p/5867649.html