OpenCV--读取图像中任意点的像素值,并显示坐标

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiakeyouwe/article/details/52075922

需求:在鼠标左键按下时,显示该位置的像素值和坐标。

在vs2010下新建了Win32控制台项目,在此只处理灰度图像,显示的像素值为灰度值

#include "iostream"
#include "cv.h"
#include "highgui.h"
#include "math.h"

using namespace std;

void mouseHandler(int event, int x, int y, int flags, void* param)
{
    IplImage *img0, *img1;
    img0 = (IplImage*)param;
    img1 = cvCreateImage(cvSize(img0->width, img0->height), img0->depth, img0->nChannels);
    cvCopy(img0, img1, NULL);

    CvFont font;
    uchar* ptr;
    char label[20];
    char label2[20];

    cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1, 1, 0, 1, 1);    //初始化字体

    if(event == CV_EVENT_LBUTTONDOWN)
    {
        //读取像素
        ptr = cvPtr2D(img0, y, x, NULL);

        sprintf(label, "Grey Level:%d", ptr[0]);
        sprintf(label2, "Pixel: (%d, %d)", x, y);
        //调整显示位置
        if(img0->width - x <= 180 || img0->height - y <= 20)
        {
    cvRectangle(img1, cvPoint(x-180, y-40), cvPoint(x-10, y-10), CV_RGB(255, 0, 0), CV_FILLED, 8, 0);
    cvPutText(img1, label, cvPoint(x-180, y-30), &font, CV_RGB(255, 255, 255));
    cvPutText(img1, label2, cvPoint(x-180, y-10), &font, CV_RGB(255, 255, 255));
        }
        else
        {
    cvRectangle(img1, cvPoint(x+10, y-12), cvPoint(x+180, y+20), CV_RGB(255, 0, 0), CV_FILLED, 8, 0);
    cvPutText(img1, label, cvPoint(x+10, y), &font, CV_RGB(255, 255, 255));
    cvPutText(img1, label2, cvPoint(x+10, y+20), &font, CV_RGB(255, 255, 255));
        }
        //以鼠标为中心画点
        CvPoint centerPoint;
        centerPoint.x = x;
        centerPoint.y = y;
        cvCircle(img1, centerPoint, 3, CV_RGB(0, 0, 0), 1, 8, 3);

        cvShowImage("img", img1);
    }
}
int main()
{
    int exit = 0;
    int c;
    IplImage* img;
    img = cvLoadImage("点云图.png", 1);
    //img = cvLoadImage("hotel201.pgm", 1);
    assert(img);

    if(img->nChannels != 1) //判断是否为灰度图像,若不是,先转换为灰度图像
    {
        //转换为灰度图像
        IplImage* gray = cvCreateImage(cvGetSize(img), img->depth, 1); 
        cvCvtColor(img, gray, CV_BGR2GRAY); 
    }
    cvNamedWindow("img", 1);
    cvSetMouseCallback("img", mouseHandler, (void*)img);
    cvShowImage("img", img);
    //检测键盘输入,按Q键退出程序
    while(!exit)
    {
        c = cvWaitKey(0);
        switch(c)
        {
        case 'q':
            exit = 1;
            break;
        default:
            continue;
        }
    }
    cvDestroyAllWindows();
    cvReleaseImage(&img);
    return 0;
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

注:调整显示位置那部分代码理解为如果鼠标点击的位置太靠近边缘,显示的矩形框会在图片之外,用户无法看到,故设置了检测,如果靠近边缘,就在另一边显示内容。

效果见图:(采用例子为2D点云图)
这里写图片描述

转载自:https://blog.csdn.net/jiakeyouwe/article/details/52075922

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiakeyouwe/article/details/52075922

需求:在鼠标左键按下时,显示该位置的像素值和坐标。

猜你喜欢

转载自blog.csdn.net/baidu_38172402/article/details/82788774