1. 程式人生 > >OpenCV--讀取影象中任意點的畫素值,並顯示座標

OpenCV--讀取影象中任意點的畫素值,並顯示座標


需求:在滑鼠左鍵按下時,顯示該位置的畫素值和座標。

在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點雲圖)
這裡寫圖片描述