opencv 输出图片中某一区域坐标平均值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv 输出图片中某一区域坐标平均值相关的知识,希望对你有一定的参考价值。

我用的opencv 2.3.1 + VS 2010
如何 “将一张彩色图片二值化后(设置阈值为250),找出二色图中的 最大 的 两个 白色区域,输出这两个区域平均坐标值。”
代码最好有注释,感谢!

参考技术A 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;

追问

你好,您的回答好像不是很符合我的问题吧...

[C++][转载]opencv截取图像中某一区域的方法

Mat图像存储:

Mat img= imread(image);
Rect rect(50,20, 200, 50); 
Mat ROI = img(rect); 
imshow("ROI_WIN",ROI);

- 其中:Rect的函数定义为: Rect(_Tp _x, _Tp _y, _Tp _width, _Tp _height); 
_Tp _x:表示矩形左上角顶点的x坐标; _Tp _y:表示矩形左上角顶点的y坐标; 
_Tp _width:表示矩形框的宽度 ; _Tp _height:表示矩形框的高度

另外:srcImage(rect).copyTo(roiImage)也可以达到同样的效果!

IplImage*图像存储:

CvSize size= cvSize(40,50);//区域大小
cvSetImageROI(pSrc,cvRect(60,70,size.width, size.height));//设置源图像ROI
IplImage* pDest = cvCreateImage(size,pSrc->depth,pSrc->nChannels);//创建目标图像
cvCopy(pSrc,pDest); //复制图像
cvResetImageROI(pDest);//源图像用完后,清空ROI
cvSaveImage("Roi.jpg",pDest);//保存目标图像

如果您使用的opencvsharp C#版本可以使用Clone方法完成ROI区域提取

以上是关于opencv 输出图片中某一区域坐标平均值的主要内容,如果未能解决你的问题,请参考以下文章

用shell语言能计算csv文件中某一列数据的平均值吗?如何实现?

[C++][转载]opencv截取图像中某一区域的方法

如何计算多张图片的平均值

OPENCV求取一副图片RGB三通道均值

网友提问(透视变化)

Opencv 中图片像素操作的应用实例——计算图片某一种颜色区域大小所占比