如何使用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);i std::是否要合并两个排序的点序列?将每个点的第一个数量视为ID。提取具有相同ID的点并将其存储在向量中。现在使用排序函数对每个向量进行排序。@shwetagupta-您最初标记了文章和,标题中提到了c和OpenCV。您的问题的解决方案各不相同你的意思是什么?另外,你提供的代码示例不完整(无法运行,没有定义k
以及其他内容…请参见如何包含代码)。代码中没有OpenCV,那它是干什么的?@shwetagupta很好,你找到了编辑按钮……但是如果你没有找到最简单的示例链接,那么应该清楚地看到什么:阅读。我们的硬盘上没有OpenCV.png
的副本;我们也不清楚是否应该这样做(或者这个问题与OpenCV有任何关系)。此外,“它不工作”是不够的;它不是编译吗?是不是邪恶的声音在扬声器上播放而不是显示图像?你如何证明你是用一个好的、最小的te来处理这个问题的