OpenCV中获取图像某一像素值

作者:袖梨 2022-07-02

This is a basic example for the OpenCV.


First we must know the structure of IplImage:

  • IPL image:
    IplImage
      |-- int  nChannels;     // Number of color channels (1,2,3,4)
      |-- int  depth;         // Pixel depth in bits: 
      |                       //   IPL_DEPTH_8U, IPL_DEPTH_8S, 
      |                       //   IPL_DEPTH_16U,IPL_DEPTH_16S, 
      |                       //   IPL_DEPTH_32S,IPL_DEPTH_32F, 
      |                       //   IPL_DEPTH_64F
      |-- int  width;         // image width in pixels
      |-- int  height;        // image height in pixels
      |-- char* imageData;    // pointer to aligned image data
      |                       // Note that color images are stored in BGR order
      |-- int  dataOrder;     // 0 - interleaved color channels, 
      |                       // 1 - separate color channels
      |                       // cvCreateImage can only create interleaved images
      |-- int  origin;        // 0 - top-left origin,
      |                       // 1 - bottom-left origin (Windows bitmaps style)
      |-- int  widthStep;     // size of aligned image row in bytes
      |-- int  imageSize;     // image data size in bytes = height*widthStep
      |-- struct _IplROI *roi;// image ROI. when not NULL specifies image
      |                       // region  to be processed.
      |-- char *imageDataOrigin; // pointer to the unaligned origin of image data
      |                          // (needed for correct image deallocation)
      |
      |-- int  align;         // Alignment of image rows: 4 or 8 byte alignment
      |                       // OpenCV ignores this and uses widthStep instead
      |-- char colorModel[4]; // Color model - ignored by OpenCV
    //------------------------------------------------------------------------------


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


        IplImage 
    *img=cvLoadImage("c://fruitfs.bmp",1);
        CvScalar s;
        
    for(int i=0;i<img->height;i++){
            
    for(int j=0;j<img->width;j++){
            s
    =cvGet2D(img,i,j); // get the (i,j) pixel value
            printf("B=%f, G=%f, R=%f ",s.val[0],s.val[1],s.val[2]);
            s.val[
    0]=111;
            s.val[
    1]=111;
            s.val[
    2]=111;
            cvSet2D(img,i,j,s);
    //set the (i,j) pixel value
            }

        }

        cvNamedWindow(
    "Image",1); 

        cvShowImage(
    "Image",img);
        cvWaitKey(
    0); //等待按键 

        cvDestroyWindow( 
    "Image" );//销毁窗口
        cvReleaseImage( &img ); //释放图像 

        
    return 0;
    }
     

     

     其实还有更好的方法,例如将其封装成类,调用起来更加方便,效率也很高。
  • 相关文章

    精彩推荐