OpenCV----疑惑问题
2009-07-28 08:27
127 查看
《OpenCV教程--基础篇》里面讲了一个二维数组排序的程序,在程序中都是随机生成的数据,但是为什么每次生成的数据都一样,感到疑惑。贴出来和大家探讨一下:
源程序如下:
/* 程序名:cvmat.c
功能:说明矩阵的一些操作方法
*/
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
void PrintMat(CvMat *A); // 显示矩阵
void GenRandn(CvMat *arr, int seed); // 生成正态分布的随机矩阵
void GenRand(CvMat *arr, int seed); // 生成[0,1]均匀分布的随机矩阵
static int cmp_func( const void* _a, const void* _b, void* userdata ); // 比较函数
void Test_Multiply(); // 测试矩阵乘法
void Test_cvGetRawData(); // 将缓存数据填入CvMat数组中
void Test_DCT(); // 计算DCT变换
void Test_Rand(); // 生成随机数
void Test_SeqSort(); // 二维序列排序
int main()
{
Test_SeqSort(); // pass
return 0;
}
// Testing: Sort 2d points in top-to-bottom left-to-right order.
void Test_SeqSort()
{
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* seq = cvCreateSeq( CV_32SC2, sizeof(CvSeq), sizeof(CvPoint), storage );
int i;
printf("/n=== Test sequence sorting ===");
for( i = 0; i < 10; i++ )
{
CvPoint pt;
pt.x = rand() % 1000; // 1000 以内的随机数
pt.y = rand() % 1000;
cvSeqPush( seq, &pt );
}
printf("/nOriginal point set:/n");
for( i = 0; i < seq->total; i++ )
{
CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, i );
printf( "(%d,%d)/n", pt->x, pt->y );
}
cvSeqSort( seq, cmp_func, 0 /* userdata is not used here */ );
/* print out the sorted sequence */
printf("/nAfter sorting:/n");
for( i = 0; i < seq->total; i++ )
{
CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, i );
printf( "(%d,%d)/n", pt->x, pt->y );
}
cvClearSeq( seq ); // Sequence clearing should be done before storage clearing
cvReleaseMemStorage( &storage );
}
static int cmp_func( const void* _a, const void* _b, void* userdata )
{
CvPoint* a = (CvPoint*)_a;
CvPoint* b = (CvPoint*)_b;
int y_diff = a->y - b->y;
int x_diff = a->x - b->x;
return y_diff ? y_diff : x_diff;
}
运行结果:
和书上运行的结果也一摸一样。有懂的指点一下,谢谢!
源程序如下:
/* 程序名:cvmat.c
功能:说明矩阵的一些操作方法
*/
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
void PrintMat(CvMat *A); // 显示矩阵
void GenRandn(CvMat *arr, int seed); // 生成正态分布的随机矩阵
void GenRand(CvMat *arr, int seed); // 生成[0,1]均匀分布的随机矩阵
static int cmp_func( const void* _a, const void* _b, void* userdata ); // 比较函数
void Test_Multiply(); // 测试矩阵乘法
void Test_cvGetRawData(); // 将缓存数据填入CvMat数组中
void Test_DCT(); // 计算DCT变换
void Test_Rand(); // 生成随机数
void Test_SeqSort(); // 二维序列排序
int main()
{
Test_SeqSort(); // pass
return 0;
}
// Testing: Sort 2d points in top-to-bottom left-to-right order.
void Test_SeqSort()
{
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* seq = cvCreateSeq( CV_32SC2, sizeof(CvSeq), sizeof(CvPoint), storage );
int i;
printf("/n=== Test sequence sorting ===");
for( i = 0; i < 10; i++ )
{
CvPoint pt;
pt.x = rand() % 1000; // 1000 以内的随机数
pt.y = rand() % 1000;
cvSeqPush( seq, &pt );
}
printf("/nOriginal point set:/n");
for( i = 0; i < seq->total; i++ )
{
CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, i );
printf( "(%d,%d)/n", pt->x, pt->y );
}
cvSeqSort( seq, cmp_func, 0 /* userdata is not used here */ );
/* print out the sorted sequence */
printf("/nAfter sorting:/n");
for( i = 0; i < seq->total; i++ )
{
CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, i );
printf( "(%d,%d)/n", pt->x, pt->y );
}
cvClearSeq( seq ); // Sequence clearing should be done before storage clearing
cvReleaseMemStorage( &storage );
}
static int cmp_func( const void* _a, const void* _b, void* userdata )
{
CvPoint* a = (CvPoint*)_a;
CvPoint* b = (CvPoint*)_b;
int y_diff = a->y - b->y;
int x_diff = a->x - b->x;
return y_diff ? y_diff : x_diff;
}
运行结果:
和书上运行的结果也一摸一样。有懂的指点一下,谢谢!
相关文章推荐
- opencv的cvcopy问题,疑惑!!!!
- Opencv安装问题
- opencv做摄像机标定遇到的问题
- OpenCV中的内存泄露问题(cvLoadImage,cvCloneImage)
- 由lib引发的血案(opencv找不函数问题)
- opencv图片读取问题
- 关于最新OpenCV在链接时的一些问题
- opencv小问题
- opencv 解决读图像宽度大于1400 BMP图像问题
- [opencv]opencv中的坐标系问题
- 疑惑的问题
- Android - 添加Android的OpenCV依赖库(Android Dependencies) 问题
- ubuntu16.04 下安装加入opencv_contribute包的GPU版本的OpenCV3.2(CUDA支持)步骤与问题解决
- OpenCV findContours导致程序崩溃和相关使用问题
- 编程经验:Cmake编译Opencv3.0&extra model所遇到的种种问题~
- 双目测距与三维重建的OpenCV实现问题集锦(二)双目定标与双目校正
- zookeeper常见问题/疑惑
- OpenCV Sobel算子水平和垂直方向导数问题
- Linux下编译Opencv2.3.1遇到的问题
- 关于使用opencv的提速(二)(多线程问题,openMP)