opencv OpenCV访问图像像素, 数组元素等方法收集

27 篇文章 3 订阅
 

opencv OpenCV访问图像像素, 数组元素等方法收集

分类: OPENCV   104人阅读  评论(0)  收藏  举报
[cpp]  view plain copy
  1. IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);  
  2. CvScalar s;  
  3. s=cvGet2D(img,i,j); // get the (i,j) pixel value  
  4. printf("intensity=%f\n",s.val[0]);  
  5. s.val[0]=111;  
  6. cvSet2D(img,i,j,s); // set the (i,j) pixel value  
  7.   
  8. o For a multi-channel float (or byte) image:  
  9.   
  10. IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);  
  11. CvScalar s;  
  12. s=cvGet2D(img,i,j); // get the (i,j) pixel value  
  13. printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]);  
  14. s.val[0]=111;  
  15. s.val[1]=111;  
  16. s.val[2]=111;  
  17. cvSet2D(img,i,j,s); // set the (i,j) pixel value  
  18.   
  19. * Direct access: (Efficient access, but error prone)  
  20.   
  21. o For a single-channel byte image:  
  22.   
  23. IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);  
  24. ((uchar *)(img->imageData + i*img->widthStep))[j]=111;  
  25.   
  26. o For a multi-channel byte image:  
  27.   
  28. IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);  
  29. ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B  
  30. ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G  
  31. ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R  
  32.   
  33. o For a multi-channel float image:  
  34.   
  35. IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);  
  36. ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B  
  37. ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G  
  38. ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R  
  39.   
  40. * Direct access using a pointer: (Simplified and efficient access under limiting assumptions)  
  41.   
  42. o For a single-channel byte image:  
  43.   
  44. IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);  
  45. int height = img->height;  
  46. int width = img->width;  
  47. int step = img->widthStep/sizeof(uchar);  
  48. uchar* data = (uchar *)img->imageData;  
  49. data[i*step+j] = 111;  
  50.   
  51. o For a multi-channel byte image:  
  52.   
  53. IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);  
  54. int height = img->height;  
  55. int width = img->width;  
  56. int step = img->widthStep/sizeof(uchar);  
  57. int channels = img->nChannels;  
  58. uchar* data = (uchar *)img->imageData;  
  59. data[i*step+j*channels+k] = 111;  
  60.   
  61. o For a multi-channel float image (assuming a 4-byte alignment):  
  62.   
  63. IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);  
  64. int height = img->height;  
  65. int width = img->width;  
  66. int step = img->widthStep/sizeof(float);  
  67. int channels = img->nChannels;  
  68. float * data = (float *)img->imageData;  
  69. data[i*step+j*channels+k] = 111;  
  70.   
  71. * Direct access using a c++ wrapper: (Simple and efficient access)  
  72.   
  73. o Define a c++ wrapper for single-channel byte images, multi-channel byte images, and multi-channel float images:  
  74.   
  75. template<class T> class Image  
  76. {  
  77. private:  
  78. IplImage* imgp;  
  79. public:  
  80. Image(IplImage* img=0) {imgp=img;}  
  81. ~Image(){imgp=0;}  
  82. void operator=(IplImage* img) {imgp=img;}  
  83. inline T* operator[](const int rowIndx) {  
  84. return ((T *)(imgp->imageData + rowIndx*imgp->widthStep));}  
  85. };  
  86.   
  87. typedef struct{  
  88. unsigned char b,g,r;  
  89. } RgbPixel;  
  90.   
  91. typedef struct{  
  92. float b,g,r;  
  93. } RgbPixelFloat;  
  94.   
  95. typedef Image<RgbPixel> RgbImage;  
  96. typedef Image<RgbPixelFloat> RgbImageFloat;  
  97. typedef Image<unsigned char> BwImage;  
  98. typedef Image<float> BwImageFloat;  
  99.   
  100. o For a single-channel byte image:  
  101.   
  102. IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);  
  103. BwImage imgA(img);  
  104. imgA[i][j] = 111;  
  105.   
  106. o For a multi-channel byte image:  
  107.   
  108. IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);  
  109. RgbImage imgA(img);  
  110. imgA[i][j].b = 111;  
  111. imgA[i][j].g = 111;  
  112. imgA[i][j].r = 111;  
  113.   
  114. o For a multi-channel float image:  
  115.   
  116. IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);  
  117. RgbImageFloat imgA(img);  
  118. imgA[i][j].b = 111;  
  119. imgA[i][j].g = 111;  
  120. imgA[i][j].r = 111;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值