Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用c在opencv中基于X轴对点向量进行排序?_C_Opencv - Fatal编程技术网

如何使用c在opencv中基于X轴对点向量进行排序?

如何使用c在opencv中基于X轴对点向量进行排序?,c,opencv,C,Opencv,我在水平和垂直方向上检测到边缘。我填充了一组坐标。现在我想合并它们。其中一个按升序包含数据: (0,106),(0,107),(1,5),(1,6),(2,8)... 另一个向量有点 (0,2),(0,5),(0,106),(0,107),(0,108),(1,6),(2,1)... 我希望输出为: (0,2),(0,5),(0,106),(0,107),(0,108),(1,5),(1,6),(2,1),(2,8) 它不能正常工作 代码如下: #include "stdafx.

我在水平和垂直方向上检测到边缘。我填充了一组坐标。现在我想合并它们。其中一个按升序包含数据:

(0,106),(0,107),(1,5),(1,6),(2,8)...
另一个向量有点

(0,2),(0,5),(0,106),(0,107),(0,108),(1,6),(2,1)...
我希望输出为:

(0,2),(0,5),(0,106),(0,107),(0,108),(1,5),(1,6),(2,1),(2,8)
它不能正常工作

代码如下:

     #include "stdafx.h"

    #include <stdio.h>
    #include "opencv2/core/core.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include <iostream>
    #include <math.h>
    #include <string.h>
    #include <time.h>
    #include<fstream>

    using namespace cv;
    using namespace std;
    float *diffx2,*diffy1;

    int _tmain(int argc, _TCHAR* argv[])
    {

    float   x1[1500],y1[1500],yy,xx,x2[1500],y2[1500];
    Point2f c,point;


    Mat img;


    float diffx1[250][250],diffy2[250][250];

    diffx2= new float[50000];
    diffy1=new float[50000];

    `img=cvLoadImage("C:\\Users\\abc\\Desktop\\opencv.png");



   imshow("Original image",img);
   cvtColor(img,img,CV_BGR2GRAY);
    imshow("gray img",img);
    printf("img rows=%d,img cols=%d",img.rows,img.cols);

Scalar intensity,nextx,currentx,prevx,nexty,prevy,currenty;

 /////////////for horizontal direction  ------>
int k=0;


for(int i=0;i<img.rows;i++)
    for(int j=0;j<img.cols;j++)
    {
        if(j==img.cols-1 )
            nextx=0;
        else
            nextx=img.at<uchar>(i,j+1);

        currentx=img.at<uchar>(i,j);


        if(j==0)
            prevx=0;
        else
            prevx=img.at<uchar>(i,j-1);

        diffx1[i][j]=(nextx.val[0]-currentx.val[0]);
        diffx2[k]=(nextx.val[0]+prevx.val[0]-2*(currentx.val[0]));
        k++;
    } 

    k=0;
int l=0;
for( int ii=0;ii<img.rows;ii++)
    for(int jj=0;jj<img.cols;jj++)
    {
        if((diffx2[k-1]>0 && diffx2[k+1]<=0) || (diffx2[k-1]<=0 && diffx2[k+1]>0))
            if(abs(diffx1[ii][jj])>0)
            {   
                x1[l]=ii;
                y1[l]=jj;
                l++;
            }
        k++;    
    }
int k1=0;
for(int i1=0;i1<img.rows ;i1++)
    for(int j1=0;j1<img.cols ;j1++)
    {
        if(i1==img.rows-1 )
            nexty=0;
        else
            nexty=img.at<uchar>(i1+1,j1);

        if(i1==0)
            prevy=0;
        else
            prevy=img.at<uchar>(i1-1,j1);

        currenty=img.at<uchar>(i1,j1);

        diffy1[k1]=(nexty.val[0]-currenty.val[0]);
        diffy2[i1][j1]=(nexty.val[0]+prevy.val[0]-2*(currenty.val[0]));
        k1++;
    }

    k1=0;
    int l1=0;
for( int ii=0;ii<img.rows ;ii++)
    for(int jj=0;jj<img.cols ;jj++)
    {

        if((diffy2[ii-1][jj]>0 && diffy2[ii+1][jj]<0) || (diffy2[ii-1][jj]<0 && diffy2[ii+1][jj]>0))
            if(abs(diffy1[k1])>0)
            {   
                x2[l1]=ii;
                y2[l1]=jj;
                l1++;
            }
            k1++;
    }

    float x3[2500], y3[2500];
    int ik = 0, kk = 0;
    int p1 = 0;
    int j = 0;
    int i = 0;
    for (int o = 0; o < l + l1;) {
        if (i < l && j < l1) {
            if (x1[i] == x2[j]) {
                if (y1[i] == y2[j]) {
                    x3[p1] = x1[i];
                    y3[p1] = y1[i];
                    p1++;
                    i++;
                    j++;
                } else if (y1[i] < y2[j]) {
                    x3[p1] = x1[i];
                    y3[p1] = y1[i];
                    p1++;
                    i++;
                } else {
                    x3[p1] = x2[j];
                    y3[p1] = y2[j];

                    p1++;
                    j++;
                }
            } else if (x1[i] < x2[j]) {
                x3[p1] = x1[i];
                y3[p1] = y1[i];
                p1++;
                i++;
            } else {
                x3[p1] = x2[j];
                y3[p1] = y2[j];
                p1++;
                j++;
            }
            o++;
        }
        if (i == l && j < l1) {
            x3[p1] = x2[j];
            y3[p1] = y2[j];
            p1++;
            j++;
            o++;
        }
        if (i < l && j == l1) {
            x3[p1] = x1[i];
            y3[p1] = y1[i];
            p1++;
            i++;
            o++;
        }
    }

        cvWaitKey();
        return 0;

    }
#包括“stdafx.h”
#包括
#包括“opencv2/core/core.hpp”
#包括“opencv2/imgproc/imgproc.hpp”
#包括“opencv2/highgui/highgui.hpp”
#包括
#包括
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
浮动*diffx2,*diffy1;
int _tmain(int argc,_TCHAR*argv[]
{
浮点数x1[1500],y1[1500],yy,xx,x2[1500],y2[1500];
点2f c,点;
Mat-img;
浮动diffx1[250][250],diffy2[250][250];
diffx2=新浮点数[50000];
diffy1=新浮动[50000];
`img=cvLoadImage(“C:\\Users\\abc\\Desktop\\opencv.png”);
imshow(“原始图像”,img);
CVT颜色(img、img、CV_bgr2灰色);
imshow(“灰色img”,img);
printf(“img行=%d,img列=%d”,img.rows,img.cols);
标量强度,nextx,currentx,prevx,nexty,prevy,currenty;
/////////////对于水平方向------->
int k=0;

对于(inti=0;i,假设你有很多点

(0106)、(10111)、(1,5)、(1,2)、(2,8)、(5,2)、(10,1)、(0109)、(0100)、(9106)、(1,6)、(2,1)

您希望按升序对它们进行排序,因此结果应为

(0100)、(0106)、(0109)、(1,2)、(1,5)、(1,6)、(2,1)、(2,8)、(5,2)、(9106)、(10,1)、(10111)

将数据存储在
vector
中,并使用
sort2Dpoints()
。这是我的代码

#include <iostream>
#include <vector>
#include <algorithm>

class Point
{
public:
    Point(int x, int y) : m_x(x), m_y(y)
    {}
    int m_x, m_y;
};



class PointStore
{
public:
    PointStore (int id) : m_id(id)
    {
    }
    int m_id;
    void addY(int y )
    {
        vecY.push_back( y );
        std::sort (vecY.begin(), vecY.begin()+vecY.size() );
    }
    int  getID() { return m_id; };
    std::vector<int> vecY;

};


std::vector< Point* > sort2Dpoints( const std::vector<Point>& vec )
{
    std::vector< PointStore* > storage;


    for ( int i(0); i < vec.size(); ++i ){
        int tempID = vec[i].m_x;

        if ( i == 0 ){
            storage.push_back( new PointStore(tempID) );
            storage[i]->addY( vec[i].m_y );
        }else{
            ////////////////////////////////////////////////
            bool isNew = true;

            for ( int j(0); j < storage.size(); ++j ){
                if ( tempID == storage[j]->getID() ){
                    isNew = false;
                    break;
                }
            }

            if ( isNew ){
                storage.push_back( new PointStore(tempID) );

                for (int k(0); k < storage.size(); ++k ){
                    if ( tempID == storage[k]->getID() )
                        storage[k]->addY( vec[i].m_y );

                }

            }else{


                for (int k(0); k < storage.size(); ++k ){
                    if ( tempID == storage[k]->getID() )
                        storage[k]->addY( vec[i].m_y );

                }

            }


        }////////////////////////////////////////////////
    }

    std::vector<int> vecID;

    for ( int i(0); i < storage.size(); ++i) {

        int tempID = storage[i]->getID();

        std::vector<int>::iterator it;

        it = find (vecID.begin(), vecID.end(), tempID);
        if ( !(it != vecID.end()) )
            vecID.push_back( tempID );


    }

    std::sort (vecID.begin(), vecID.begin()+vecID.size() );


    std::vector< Point* > sortedPoints;

    for (int i(0); i < vecID.size(); ++i ){
        for ( int j(0); j < storage.size(); ++j ){
            if ( vecID[i] == storage[j]->getID() ){
                for ( int k(0); k < storage[j]->vecY.size(); ++k )
                    sortedPoints.push_back( new Point (vecID[i], storage[j]->vecY[k] ) );

            }
        }
    }


    return sortedPoints;
}


int main(int argc, const char * argv[]) {


    Point p1(0,106),            // (0 ,106), (0,100), (0,109)
          p2(10,111),           // (1 ,  2), (1,  5), (1,  6)
          p3(1,5),              // (2 ,  1), (2,  8)
          p4(1,2),              // (5 ,  2)
          p5(2,8),              // (9 ,106)
          p6(5,2),              // (10,  1), (10,111)
          p7(10,1),
          p8(0,109),
          p9(0,100),
          p10(9,106),
          p11(1,6),
          p12(2,1);

    std::vector<Point> vec;
    vec.push_back( p1 );
    vec.push_back( p2 );
    vec.push_back( p3 );
    vec.push_back( p4 );
    vec.push_back( p5 );
    vec.push_back( p6 );
    vec.push_back( p7 );
    vec.push_back( p8 );
    vec.push_back( p9 );
    vec.push_back( p10 );
    vec.push_back( p11 );
    vec.push_back( p12 );


    for ( int i(0); i < vec.size(); ++i) {
            std::cout << "(" << vec[i].m_x << "," << vec[i].m_y << "), ";
    }
    std::cout << std::endl;

    std::vector< Point* > sortedPoints = sort2Dpoints( vec );


    for ( int i(0); i < sortedPoints.size(); ++i )
        std::cout << "(" << sortedPoints[i]->m_x << "," << sortedPoints[i]->m_y << ") ,";

    std::cout << std::endl;



    return 0;
}
#包括
#包括
#包括
类点
{
公众:
点(int x,int y):m_x(x),m_y(y)
{}
int m_x,m_y;
};
类点存储
{
公众:
点存储(int-id):m_-id(id)
{
}
国际货币基金组织;
空地址(整数y)
{
向量。推回(y);
排序(vecY.begin(),vecY.begin()+vecY.size());
}
int getID(){return m_id;};
向量向量;
};
std::vectorsort2Dpoints(const std::vector&vec)
{
标准::向量存储;
for(int i(0);iaddY(vec[i].m_-y);
}否则{
////////////////////////////////////////////////
bool isNew=true;
对于(int j(0);jgetID()){
isNew=false;
打破
}
}
如果(是新的){
存储。推回(新点存储(tempID));
for(int k(0);kgetID())
存储器[k]->addY(vec[i].my);
}
}否则{
for(int k(0);kgetID())
存储器[k]->addY(vec[i].my);
}
}
}////////////////////////////////////////////////
}
向量向量ID;
for(int i(0);igetID();
std::vector::it迭代器;
it=find(vecID.begin()、vecID.end()、tempID);
if(!(it!=vecID.end())
vecID.推回(tempID);
}
排序(vecID.begin(),vecID.begin()+vecID.size());
标准::向量<点*>分类点;
for(int i(0);igetID()){
for(int k(0);kvecY.size();++k)
分类点。推回(新点(vecID[i],存储[j]->vecY[k]);
}
}
}
返回分拣点;
}
int main(int argc,const char*argv[]{
点p1(0106),/(0,106),(0100),(0109)
p2(10111),/(1,2),(1,5),(1,6)
p3(1,5),/(2,1),(2,8)
p4(1,2),/(5,2)
p5(2,8),/(9106)
p6(5,2),/(10,1),(10111)
p7(10,1),
p8(0109),
p9(0100),
p10(9106),
p11(1,6),
p12(2,1);
std::vec;
向量推回(p1);
向量推回(p2);
向量推回(p3);
向量推回(p4);
向量推回(p5);
向量推回(p6);
向量推回(第7页);
向量推回(第8页);
向量推回(第9页);
向量推回(p10);
向量推回(p11);
向量推回(p12);
for(int i(0);istd::是否要合并两个排序的点序列?将每个点的第一个数量视为ID。提取具有相同ID的点并将其存储在向量中。现在使用排序函数对每个向量进行排序。@shwetagupta-您最初标记了文章和,标题中提到了c和OpenCV。您的问题的解决方案各不相同你的意思是什么?另外,你提供的代码示例不完整(无法运行,没有定义
k
以及其他内容…请参见如何包含代码)。代码中没有OpenCV,那它是干什么的?@shwetagupta很好,你找到了编辑按钮……但是如果你没有找到最简单的示例链接,那么应该清楚地看到什么:阅读。我们的硬盘上没有
OpenCV.png
的副本;我们也不清楚是否应该这样做(或者这个问题与OpenCV有任何关系)。此外,“它不工作”是不够的;它不是编译吗?是不是邪恶的声音在扬声器上播放而不是显示图像?你如何证明你是用一个好的、最小的te来处理这个问题的