后记

当时能不放弃这个方向是因为这里面涉及了一种很有效的三位场景存储方式,可能给出除图元建模之外的一种三维场景描述方式。这和Flash与位图的对比一样,基于图元的flash始终抵不过基于点描述的位图格式。

总结:OpenNI已经有了一个专门的语句对标定进行了封装,我们不需要再费力去使用自己的代码了。

原文链接:http://www.cnblogs.com/tornadomeet/archive/2012/09/27/2706417.html

系列文章,作者相当给力!

不过有一个更为强大的文章:http://blog.csdn.net/chenyusiyuan/article/details/6279762

OpenCV学习笔记(20)Kinect + OpenNI + OpenCV + OpenGL 组合体验

Kinect+OpenNI学习笔记之(获取kinect的颜色图像和深度图像)

  前言

  网上有不少使用Qt做界面,OpenNI为库来开发kinect。或许大家的第一个问题就是询问该怎样使用Kinect来获取颜色信息图和深度信息图呢?这一节就是简单来回答这个问题的。

  开发环境:QtCreator2.5.1+OpenNI1.5.4.0+Qt4.8.2;原因:Qt与VTK可以完美融合,虽然工作量不大,但是还是没有时间了。

  实验说明:

  在使用OpenNI来驱动读取kinect数据时,我们需要了解context object这个名词。查看了下OpenNI UserGuide文档,简单翻译下这个名词的意思:

  Context是openNI中一个主要的object,它掌握了OpenNI使用过程中应用程序的全部状态,以及这些状态的prodection chains,一个应用程序有多个context,但是这些context之间不能共享信息。例如一个中间件节点不能使用另一个context的驱动节点。Context在使用前必须被立即初始化,因此此时所有嵌入的模块被下载和分析。为了释放context的内存,应用程序需调用shutdown程序。

  虽然翻译得不准确,但是它的大概意思就是告诉我们在驱动kinect时,需要用到context这个类,且我们需要安装一定顺序去使用,这与一些常见的库驱动差不多,比如opengl,这些都需要什么初始化啊,设置属性啊等。因此我们只需要直接去看懂他人的一个工程实例就ok了。

  好了,本文参考Heresy的教程中的源码写的。

  在新建好工程文件后,需要包含XnCppWrapper头文件,且需在Qt工程中设置好头文件目录和库文件目录。

  使用OpenNI读取颜色图和深度图的步骤如下(这个是程序的核心部分):

  1. 定义一个Context对象,并 调用该对象的Init()方法来进行初始化。

  2. 定义一个XnMapOutputMode格式对象,设置好分图像分辨率和帧率。

  3. 定义颜色图和深度图的节点对象,并用其Create()方法来创建,参数为Context对象.

  4. 设置颜色和深度图的输出模式,调用的方法是SetMapOutputMode();参数为步骤2中定义和设置好了的XnMapOutputMode对象。

  6. 如果深度图和颜色图在一张图上显示,则必须对深度图像进行校正,校正的方法是调用深度图的如下方法:.GetAlternativeViewPointCap().SetViewPoint();

  7. 调用context对象的StartGeneratingAll()来开启设备读取数据开关。

  8. 调用context对象的更新数据方法,比如WaitAndupdateAll()方法。

  9. 定义颜色图和色彩图的ImageMetaData对象,并利用对应的节点对象的方法GetMetaData(),将获取到的数据保存到对应的ImageMetaData对象中。

  10. 如果需要将深度图转换成灰度图来显示,则需要自己将深度值转换成0~255的单通道或者多通道数据,然后直接用来显示。

  注意如果没有设置视觉校正,则深度图的显示与颜色图的显示会出现对应不上的情况,后面的实验可以看出这2者的区别,另外对于是否需要设置镜像就要看自己的具体应用场合了。

  实验结果:

  下面分别分是否设置图像镜像,是否对深度图像进行校正来给出实验结果.

  无镜像无校正:

  

  无镜像有校正:

  

  有镜像无校正:  

  

  有镜像有校正:

  

  从有无镜像可以看出,设置镜像的效果与字面的理解是一样的,即有镜像时就相当于取镜子中的图像。有无校正可以看出,没有校正时,深度图片和颜色图片同一个物体都对应不起来,可以看下天花板上的吊灯就可以发现,没校正,2者不重合,且相差不少。有校正时效果就好多了,只是此时的深度图像显示的范围要稍小些。

实验主要部分代码及注释(附录有工程code下载链接):

  首先来个最小工程,即去掉那些错误处理代码:

  main.cpp:

  1. #include <QtGui>
  2. #include <XnCppWrapper.h> //包含OpenNI的头文件
  3.  
  4. using namespace xn;//使用OpenNI库中的命名空间
  5.  
  6. //全局的OpenNI object
  7. Context g_context;
  8. ImageGenerator g_image_generator;
  9. DepthGenerator g_depth_generator;
  10.  
  11. //全局的Qt Object
  12. QGraphicsPixmapItem *g_image_map;
  13. QGraphicsPixmapItem *g_depth_map;
  14.  
  15. //CTimer类的定义
  16. class CTimer : public QObject
  17. {
  18. public:
  19. void start() {
  20. g_context.StartGeneratingAll();//开启设备读取数据的开关
  21. startTimer(33);//使用startTimer()启动定时器,每当时间到时会自动调用timerEvent()函数
  22. }
  23. private:
  24. void timerEvent(QTimerEvent *) {
  25. g_context.WaitAndUpdateAll();//更新数据
  26.  
  27. //颜色数据
  28. ImageMetaData image_map;
  29. g_image_generator.GetMetaData(image_map);
  30. //为g_image_map设置图片,图片的数据来源于外部硬件设备
  31. g_image_map->setPixmap(QPixmap::fromImage(QImage(image_map.Data(), image_map.XRes(),
  32. image_map.YRes(), QImage::Format_RGB888)));
  33. //深度数据
  34. DepthMetaData depth_map;
  35. g_depth_generator.GetMetaData(depth_map);
  36. XnDepthPixel max_depth_value = depth_map.ZRes();
  37. QImage depth_img(depth_map.XRes(), depth_map.YRes(), QImage::Format_ARGB32);//格式为ARGB32型的
  38. for(unsigned int i = 0; i < depth_map.XRes(); i++)
  39. for(unsigned int j = 0; j < depth_map.YRes(); j++)
  40. {
  41. XnDepthPixel depth_value_ij = depth_map(i, j);//获取x,y处的坐标值
  42. if(depth_value_ij == 0) {
  43. depth_img.setPixel(i, j, qRgba(0, 0, 0, 0));
  44. }//如果捕捉不到深度信息,则将其设置为0
  45. else {
  46. float fscale = 1.0f*depth_value_ij/max_depth_value;//当前深度的比例因子
  47. depth_img.setPixel(i, j, qRgba(255*(1-fscale), 0, 255*fscale, 255*(1-fscale)));
  48. }
  49. }
  50. g_depth_map->setPixmap(QPixmap::fromImage(depth_img));
  51. }
  52. };
  53.  
  54. int main(int argc, char **argv)
  55. {
  56. QApplication app(argc, argv);
  57.  
  58. g_context.Init();//context初始化
  59. g_context.SetGlobalMirror(true);//设置全局镜像,就像照镜子一样,与设置为false时的2张图片镜像
  60. XnMapOutputMode xmode;//定义图像的输出模式
  61. xmode.nXRes = 640;//x方向分辨率
  62. xmode.nYRes = 480;//y方向分辨率
  63. xmode.nFPS = 30;//帧率
  64. //设置颜色节点属性
  65. g_image_generator.Create(g_context);
  66. g_image_generator.SetMapOutputMode(xmode);
  67. //设置深度节点属性
  68. g_depth_generator.Create(g_context);
  69. g_depth_generator.SetMapOutputMode(xmode);
  70.  
  71. //视觉校正,否则深度图和颜色图感应到的区域不能一一对应
  72. g_depth_generator.GetAlternativeViewPointCap().SetViewPoint(g_image_generator);
  73.  
  74. //Qt场景设置
  75. QGraphicsScene scene;
  76. g_image_map = scene.addPixmap(QPixmap());
  77. g_image_map->setZValue(1);//设置为z方向上的第1层
  78. g_depth_map = scene.addPixmap(QPixmap());
  79. g_depth_map->setZValue(2);//设置为z方向上的第2层
  80.  
  81. //Qt视图创建
  82. QGraphicsView view(&scene);
  83. view.resize(660, 500);
  84.  
  85. //设置定时器,每隔一段时间读取kinect的颜色信息和深度信息
  86. CTimer timer;
  87. timer.start();
  88. view.show();
  89.  
  90. return app.exec();
  91. }

  

加入错误处理部分后的完整main.cpp:

  1. #include <QtGui>
  2. #include <XnCppWrapper.h> //包含OpenNI的头文件
  3.  
  4. using namespace xn;//使用OpenNI库中的命名空间
  5.  
  6. //全局的OpenNI object
  7. XnStatus g_status;
  8. Context g_context;
  9. ImageGenerator g_image_generator;
  10. DepthGenerator g_depth_generator;
  11. bool g_has_image_generator = true;
  12.  
  13. //全局的Qt Object
  14. QGraphicsPixmapItem *g_image_map;
  15. QGraphicsPixmapItem *g_depth_map;
  16.  
  17. //CTimer类的定义
  18. class CTimer : public QObject
  19. {
  20. public:
  21. void start() {
  22. g_status = g_context.StartGeneratingAll();//开启设备读取数据的开关
  23. if(g_status == XN_STATUS_OK) {
  24. startTimer(33);//使用startTimer()启动定时器,每当时间到时会自动调用timerEvent()函数
  25. }
  26. else {
  27. QMessageBox::critical(NULL, "Create Data Error!", xnGetStatusString(g_status));//显示创建数据失败,该消息框没有父窗口
  28. }
  29. }
  30. private:
  31. void timerEvent(QTimerEvent *) {
  32. g_context.WaitAndUpdateAll();//更新数据
  33.  
  34. //颜色数据
  35. if(g_has_image_generator) {
  36. ImageMetaData image_map;
  37. g_image_generator.GetMetaData(image_map);
  38. //为g_image_map设置图片,图片的数据来源于外部硬件设备
  39. g_image_map->setPixmap(QPixmap::fromImage(QImage(image_map.Data(), image_map.XRes(),
  40. image_map.YRes(), QImage::Format_RGB888)));
  41. }
  42. //深度数据
  43. DepthMetaData depth_map;
  44. g_depth_generator.GetMetaData(depth_map);
  45. XnDepthPixel max_depth_value = depth_map.ZRes();
  46. QImage depth_img(depth_map.XRes(), depth_map.YRes(), QImage::Format_ARGB32);//格式为ARGB32型的
  47. for(unsigned int i = 0; i < depth_map.XRes(); i++)
  48. for(unsigned int j = 0; j < depth_map.YRes(); j++)
  49. {
  50. XnDepthPixel depth_value_ij = depth_map(i, j);//获取x,y处的坐标值
  51. if(depth_value_ij == 0) {
  52. depth_img.setPixel(i, j, qRgba(0, 0, 0, 0));
  53. }//如果捕捉不到深度信息,则将其设置为0
  54. else {
  55. float fscale = 1.0f*depth_value_ij/max_depth_value;//当前深度的比例因子
  56. depth_img.setPixel(i, j, qRgba(255*(1-fscale), 0, 255*fscale, 255*(1-fscale)));
  57. }
  58. }
  59. g_depth_map->setPixmap(QPixmap::fromImage(depth_img));
  60. }
  61. };
  62.  
  63. int main(int argc, char **argv)
  64. {
  65. QApplication app(argc, argv);
  66.  
  67. g_status = g_context.Init();//context初始化
  68. if(g_status != XN_STATUS_OK) {
  69. QMessageBox::critical(NULL, "Context Initial Error!", xnGetStatusString(g_status));
  70. return -1;
  71. }
  72. // g_context.SetGlobalMirror(true);//设置全局镜像,就像照镜子一样,与设置为false时的2张图片镜像
  73. XnMapOutputMode xmode;//定义图像的输出模式
  74. xmode.nXRes = 640;//x方向分辨率
  75. xmode.nYRes = 480;//y方向分辨率
  76. xmode.nFPS = 30;//帧率
  77. //设置颜色节点属性
  78. g_status = g_image_generator.Create(g_context);
  79. if(g_status != XN_STATUS_OK) {
  80. QMessageBox::critical(NULL, "Image map create failed", xnGetStatusString(g_status));
  81. g_has_image_generator = false;
  82. }
  83. if( g_has_image_generator ) {
  84. g_status = g_image_generator.SetMapOutputMode(xmode);
  85. if(g_status != XN_STATUS_OK) {
  86. QMessageBox::critical(NULL, "Image map output mode error!", xnGetStatusString(g_status));
  87. return -1;
  88. }
  89. }
  90. //设置深度节点属性
  91. g_status = g_depth_generator.Create(g_context);
  92. if(g_status != XN_STATUS_OK) {
  93. QMessageBox::critical(NULL, "Depth map create failed", xnGetStatusString(g_status));
  94. return -1;
  95. }
  96. g_status = g_depth_generator.SetMapOutputMode(xmode);
  97. if(g_status != XN_STATUS_OK) {
  98. QMessageBox::critical(NULL, "Depth map output mode error!", xnGetStatusString(g_status));
  99. return -1;
  100. }
  101.  
  102. if(g_has_image_generator)//视觉校正,否则深度图和颜色图感应到的区域不能一一对应
  103. ;//g_depth_generator.GetAlternativeViewPointCap().SetViewPoint(g_image_generator);
  104. //Qt场景设置
  105. QGraphicsScene scene;
  106. g_image_map = scene.addPixmap(QPixmap());
  107. g_image_map->setZValue(1);//设置为z方向上的第1层
  108. g_depth_map = scene.addPixmap(QPixmap());
  109. g_depth_map->setZValue(2);//设置为z方向上的第2层
  110.  
  111. //Qt视图创建
  112. QGraphicsView view(&scene);
  113. view.resize(660, 500);
  114.  
  115. //设置定时器,每隔一段时间读取kinect的颜色信息和深度信息
  116. CTimer timer;
  117. timer.start();
  118. view.show();
  119.  
  120. return app.exec();
  121. }      总结:通过本次实验,了解了怎样使用OpenNI来显示kinect的颜色图像和深度图像了。

   参考资料:http://kheresy.wordpress.com/index_of_openni_and_kinect/comment-page-5/

   附录:实验工程code下载

作者:tornadomeet     出处:http://www.cnblogs.com/tornadomeet欢迎转载或分享,但请务必声明文章出处。 (新浪微博:tornadomeet,欢迎交流!)

总结:源代码还是挺有用的,不过最后还是放弃了,还是MFC简单一些,对于只是验证算法的我们来说,渐渐的失去了方向。

(二):把代码写在一个单独的类里面

前言

  在上一篇文章Kinect+OpenNI学习笔记之2(获取kinect的颜色图像和深度图像)中,已经介绍了怎样使用OpenNI来获取Kinect的深度数据和颜色数据,并将获取到的结果在Qt中显示,不过那个代码是写在同一个cpp文件中,以后用到的时候不能讲这些显示的基本过程单独拿出来,比较麻烦。所以这节主要是将OpenNI获取图像的流程以及Qt显示这些图像的结果分开为了2个类来写,方便以后工程的直接拷贝。

  开发环境:QtCreator2.5.1+OpenNI1.5.4.0+Qt4.8.2

  实验说明

  COpenNI这个类主要是初始化kinect设备,并获取深度图像和颜色图像,参加上一篇博客的初始化过程步骤,如果遇到错误,则有相应的错误处理过程。CKinectReader类是将COpenNI这个类读取到的结果显示在Qt的界面上的。因此一个类是负责与硬件Kinect打交道,一个类是负责与人(界面显示)打交道的。具体的过程见上篇文章的分析和后面的代码。

  这里发现一个小问题,与kinect有关的工程如果改变了代码,则在每次编译前最好clean一下,因为有可能是与硬件设备相关,没有clean的工程和clean后的工程效果有时会不同。

  C/C++知识点总结:

  在构造函数中可以使用冒号给类中的数据成员赋值,这样的好处就是可以给常量和引用变量赋值初始化赋值的效果。

  类的私有成员只能是类内部的函数调用,连类的对象都不能去调用私有成员变量。

  在类的内部使用qDebug(), cout等函数输出调试时是不行的。

  隐式数据类型转换,如果是同种类型的数据进行四则运算,则得出的结果也是那种类型,如果其中有常数类型的数据常数参与,则得出的结果会自动转换成跟常数类型相同的类型。

  如果一个类以单独一个cpp文件出现,在使用到该类的时候,直接include该cpp文件.

  实验结果

  在程序中设置了镜像和视觉校正,且将kinect感应不到深度信息的地方全部显示为不透明的黑色,因此你在图中看到的黑色部分就是kinect的深度盲区。

  效果如下:

  

  实验主要部分代码及注释(附录有工程code下载链接):

copenni.cpp:

  1. #include <XnCppWrapper.h>
  2. #include <QtGui>
  3. #include <iostream>
  4.  
  5. using namespace xn;
  6. using namespace std;
  7.  
  8. class COpenNI
  9. {
  10. public:
  11. ~COpenNI() {
  12. context.Release();//释放空间
  13. }
  14. bool Initial() {
  15. //初始化
  16. status = context.Init();
  17. if(CheckError("Context initial failed!")) {
  18. return false;
  19. }
  20. context.SetGlobalMirror(true);//设置镜像
  21. //产生图片node
  22. status = image_generator.Create(context);
  23. if(CheckError("Create image generator error!")) {
  24. return false;
  25. }
  26. //产生深度node
  27. status = depth_generator.Create(context);
  28. if(CheckError("Create depth generator error!")) {
  29. return false;
  30. }
  31. //视角校正
  32. status = depth_generator.GetAlternativeViewPointCap().SetViewPoint(image_generator);
  33. if(CheckError("Can't set the alternative view point on depth generator")) {
  34. return false;
  35. }
  36.  
  37. return true;
  38.  
  39. }
  40.  
  41. bool Start() {
  42. status = context.StartGeneratingAll();
  43. if(CheckError("Start generating error!")) {
  44. return false;
  45. }
  46. return true;
  47. }
  48.  
  49. bool UpdateData() {
  50. status = context.WaitNoneUpdateAll();
  51. if(CheckError("Update date error!")) {
  52. return false;
  53. }
  54. //获取数据
  55. image_generator.GetMetaData(image_metadata);
  56. depth_generator.GetMetaData(depth_metadata);
  57.  
  58. return true;
  59. }
  60.  
  61. public:
  62. DepthMetaData depth_metadata;
  63. ImageMetaData image_metadata;
  64.  
  65. private:
  66. //该函数返回真代表出现了错误,返回假代表正确
  67. bool CheckError(const char* error) {
  68. if(status != XN_STATUS_OK ) {
  69. QMessageBox::critical(NULL, error, xnGetStatusString(status));
  70. cerr << error << ": " << xnGetStatusString( status ) << endl;
  71. return true;
  72. }
  73. return false;
  74. }
  75.  
  76. private:
  77. XnStatus status;
  78. Context context;
  79. DepthGenerator depth_generator;
  80. ImageGenerator image_generator;
  81. };

ckinectreader.cpp:

  1. #include <QtGui>
  2. #include <QDebug>
  3. #include <XnCppWrapper.h>
  4. #include "copenni.cpp" //要包含cpp文件,不能直接包含类
  5. #include <iostream>
  6.  
  7. using namespace std;
  8.  
  9. class CKinectReader: public QObject
  10. {
  11. public:
  12. //构造函数,用构造函数中的变量给类的私有成员赋值
  13. CKinectReader(COpenNI &openni, QGraphicsScene &scene) : openni(openni), scene(scene) {
  14. test = 0.0;
  15. }
  16. ~CKinectReader() {
  17. scene.removeItem(image_item);
  18. scene.removeItem(depth_item);
  19. delete [] p_depth_argb;
  20. }
  21. bool Start(int interval = 33) {
  22. openni.Start();//因为在调用CKinectReader这个类的之前会初始化好的,所以这里直接调用Start了
  23. image_item = scene.addPixmap(QPixmap());
  24. image_item->setZValue(1);
  25. depth_item = scene.addPixmap(QPixmap());
  26. depth_item->setZValue(2);
  27. openni.UpdateData();
  28. p_depth_argb = new uchar[4*openni.depth_metadata.XRes()*openni.depth_metadata.YRes()];
  29. startTimer(interval);//这里是继承QObject类,因此可以调用该函数
  30. return true;
  31. }
  32. float test ;
  33. private:
  34. COpenNI &openni; //定义引用同时没有初始化,因为在构造函数的时候用冒号来初始化
  35. QGraphicsScene &scene;
  36. QGraphicsPixmapItem *image_item;
  37. QGraphicsPixmapItem *depth_item;
  38. uchar *p_depth_argb;
  39.  
  40. private:
  41. void timerEvent(QTimerEvent *) {
  42.  
  43. openni.UpdateData();
  44. //这里使用const,是因为右边的函数返回的值就是const类型的
  45. const XnDepthPixel *p_depth_pixpel = openni.depth_metadata.Data();
  46. unsigned int size = openni.depth_metadata.XRes()*openni.depth_metadata.YRes();
  47.  
  48. //找深度最大值点
  49. XnDepthPixel max_depth = *p_depth_pixpel;
  50. for(unsigned int i = 1; i < size; ++i)
  51. if(p_depth_pixpel[i] > max_depth )
  52. max_depth = p_depth_pixpel[i];
  53. test = max_depth;
  54.  
  55. //将深度图像格式归一化到0~255
  56. int idx = 0;
  57. for(unsigned int i = 1; i < size; ++i) {
  58. //一定要使用1.0f相乘,转换成float类型,否则该工程的结果会有错误,因为这个要么是0,要么是1,0的概率要大很多
  59. float fscale = 1.0f*(*p_depth_pixpel)/max_depth;
  60. if((*p_depth_pixpel) != 0) {
  61. p_depth_argb[idx++] = 255*(1-fscale); //蓝色分量
  62. p_depth_argb[idx++] = 0; //绿色分量
  63. p_depth_argb[idx++] = 255*fscale; //红色分量,越远越红
  64. p_depth_argb[idx++] = 255*(1-fscale); //距离越近,越不透明
  65. }
  66. else {
  67. p_depth_argb[idx++] = 0;
  68. p_depth_argb[idx++] = 0;
  69. p_depth_argb[idx++] = 0;
  70. p_depth_argb[idx++] = 255;
  71. }
  72. ++p_depth_pixpel;//此处的++p_depth_pixpel和p_depth_pixpel++是一样的
  73. }
  74. //往item中设置图像色彩数据
  75. image_item->setPixmap(QPixmap::fromImage(
  76. QImage(openni.image_metadata.Data(), openni.image_metadata.XRes(), openni.image_metadata.YRes(),
  77. QImage::Format_RGB888)));
  78. //往item中设置深度数据
  79. depth_item->setPixmap(QPixmap::fromImage(
  80. QImage(p_depth_argb, openni.depth_metadata.XRes(), openni.depth_metadata.YRes()
  81. , QImage::Format_ARGB32)));
  82. }
  83. };

main.cpp:

  1. #include <QtGui/QtGui>
  2. #include <QDebug>
  3. #include "ckinectreader.cpp"
  4.  
  5. int main(int argc, char **argv)
  6. {
  7. COpenNI openni;
  8. if(!openni.Initial())//初始化返回1表示初始化成功
  9. return 1;
  10.  
  11. QApplication app(argc, argv);
  12.  
  13. QGraphicsScene scene;
  14. QGraphicsView view;
  15. view.setScene(&scene);
  16. view.resize(650, 540);
  17. view.show();
  18.  
  19. CKinectReader kinect_reader(openni, scene);
  20. kinect_reader.Start();//启动,读取数据
  21. qDebug() << kinect_reader.test;
  22. return app.exec();
  23. }

  总结:这次实验的目的主要是将相互稍微独立的代码用单独的类来写,方便以后的代码重复利用。

  参考资料:http://kheresy.wordpress.com/2011/08/18/show_maps_of_openni_via_qt_graphicsview/

     附录:实验工程code下载

        作者:tornadomeet出处:http://www.cnblogs.com/tornadomeet欢迎转载或分享,但请务必声明文章出处。 (新浪微博:tornadomeet,欢迎交流!)

三维重建:QT+OpenNI+Kinect图像校正的更多相关文章

  1. 采用QHD分辨率使用kinect2_calibration,完成QHD图像校正

    //.................................................................................//采用QHD分辨率使用kinec ...

  2. halcon二 图像校正

    1.get_image_size(Image : : : Width, Height) 返回图像的尺寸. 2.parameters_image_to_world_plane_centered (Cam ...

  3. PyQt(Python+Qt)学习随笔:Qt Designer中图像资源的使用及资源文件的管理

    一.概述 在Qt Designer中要使用图片资源有三种方法:通过图像文件指定.通过资源文件指定.通过theme主题方式指定,对应的设置界面在需要指定图像的属性栏如windowIcon中通过点击属性设 ...

  4. Kinect 图像帧的格式

    一.ColorImageFormat:彩色图像帧的格式 RawYuvResolution640x480Fps15 原始YUV格式,分辨率是640x480,每秒15帧: RgbResolution128 ...

  5. QT+QT creator+OpenCV图像灰度化

    1).pro文件 #------------------------------------------------- # # Project created by QtCreator 2014-05 ...

  6. 一、基于Qt的图像矩形区域改色

    Qt环境下图像的打开和涂色 一.设计目标 能够在 Qt QtCreator 环境下打开常用图像格式文件,诸如 bmp.jpg.png 图像等,然后将他们转化为 Qt 中的 QImage 类,并进行矩形 ...

  7. Kinect for Windows SDK开发入门(十九):Kinect Fusion

        Kinect for Windows SDK1.7中引入了Kinect Fusion功能.在1.8的SDK中对该功能进行了改进和强化,Kinect Fusion能够使得我们使用Kinect f ...

  8. RGB_D_开发征程(使用Kinect)

    学习历程依此为纲! Kinect学习资料: kinect和openNI开发资料汇总:http://blog.csdn.net/chenli2010/article/details/6887646 原始 ...

  9. Qt webkit插件相关知识

    1.在Qt中使用 WebKit 浏览器核心 使用 QtWebKit 需要在工程文件(*.pro)中加入: 1.           QT +=webkit   2.           QT += n ...

随机推荐

  1. [Ynoi2015]盼君勿忘

    题目大意: 给定一个序列,每次查询一个区间\([l,r]\)中所有子序列分别去重后的和\(\bmod p\)(每次询问模数不同). 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后 ...

  2. 爬虫数据使用MongDB保存时自动过滤重复数据

    本文转载自以下网站: 爬虫断了?一招搞定 MongoDB 重复数据 https://www.makcyun.top/web_scraping_withpython13.html 需要学习的地方: Mo ...

  3. 将项目上传到Github之使用git命令上传

    1,先从GitHub网页上建立一个数据仓库 2,安装git 下载地址:https://www.git-scm.com/download/win 3,找到本地要上传的项目目录,右键点击Git Bash ...

  4. sqlalchemy根据表名动态创建model类

    作用如题,直接上代码吧,另外还支持 copy一张表的表结构,新建表并获得model对象 # coding: utf-8 import traceback from sqlalchemy import ...

  5. Vue.js教程—1.介绍和安装

    Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架.Vue 只关注视图层, 采用自底向上增量开发的设计.Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定 ...

  6. hdu 1568关于斐波那契数列的公式及其思维技巧

    先看对数的性质,loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c); 假设给出一个数10234432,那么log10(10234432)=log10(1.023 ...

  7. Python 字符串 String 内建函数大全(1)

    关于 Python 的字符串处理相关的方法还是许多的.因为我正在学习 Python,于是就把 Python 中这些混杂的用于 string 的函数总结出来,在自己忘记的时候便于查找,希望对于有相似需求 ...

  8. [Angular] Advanced DI

    In this post, we are going to see how to solve one design pattern challenge. The challenge is what w ...

  9. C++二叉树笔试题

    #include <iostream> #include <stack> #include <queue> using namespace std; templat ...

  10. Hadoop入门进阶步步高(一)-环境准备

    前言 Hadoop从存储上来说,是相似于冗余磁盘阵列(RAID)的存储方式.将数据分散存储并提供以提供吞吐量,它的存储系统就是HDFS(Hadoop Distuibute Fils System).从 ...