天天看點

利用OpenCV擷取圖檔上某一點的顔色HSV值

在進行圖像處理時我們經常需要根據圖像的顔色提取特定的區域處理,很多時候 RGB 是不适合的,我們需要知道感興趣區域的區域HSV各分量的範圍。

RGB 顔色使用 QQ 截圖工具或者 Windows 畫圖軟體就可以處理了,但是HSV相對小衆。

效果:

利用OpenCV擷取圖檔上某一點的顔色HSV值

OpenCV代碼比較簡單:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

#define WINDOW_NAME "【效果圖視窗】"        //為視窗标題定義的宏 

void pickHighLightFire(Mat& inputFrame, Mat& outputFrame);
void on_MouseHandle(int event, int x, int y, int flags, void* param);
int main()
{
	int multiple = 1;//圖檔的放大倍數
	Mat inputImage = imread("ld//53.jpg");//這裡放置自己的檔案路徑。
	Mat outputImage;
	resize(inputImage, inputImage, Size(multiple  * inputImage.cols, multiple  * inputImage.rows));
	cvtColor(inputImage, outputImage, COLOR_BGR2HSV);

	//設定滑鼠操作回調函數
	namedWindow(WINDOW_NAME);
	setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&outputImage);
	imshow(WINDOW_NAME, inputImage);
	while (1)
	{
		if (waitKey(10) == 27) break;//按下ESC鍵,程式退出
	}
	waitKey();
	return 0;
}

void on_MouseHandle(int event, int x, int y, int flags, void* param)
{

	Mat& image = *(cv::Mat*) param;
	switch (event)
	{
	//左鍵按下消息
	case EVENT_LBUTTONDOWN:
	{

		cout << static_cast<int>( image.at<Vec3b>(y, x)[0]) << ",";
		cout << static_cast<int>(image.at<Vec3b>(y, x)[1]) << ",";
		cout << static_cast<int>(image.at<Vec3b>(y, x)[2]) << endl;
	}
	break;
	}
}