我正在尝试为程序编写代码,当用户在单击位置单击图像时,我应该显示其RGB值。
我仔细阅读了OpenCV的文档,发现putText函数将帮助我实现所需的结果。我按照OpenCV中的文档编写了代码。
这是我的代码
cv::Mat img;
void mouse_Callback(int event , int x , int y , int flag ,void *params)
{
if(event == cv::EVENT_LBUTTONDOWN)
{
cv::Vec3b vec = img.at<cv::Vec3b>(x,y);
int b,g,r;
b = (int)vec(0);
g = (int)vec(1);
r = (int)vec(2);
cv::String st = to_string(b);
cout << b << endl;
cv::putText(img,st,cv::Point2i(x,y),cv::FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(255,100,250), 1, CV_AA);
cv::imshow("image",img);
}
}
int main()
{
cv::namedWindow("image",CV_WINDOW_AUTOSIZE);
img = cv::imread("1.jpg",-1);
cv::setMouseCallback("image",mouse_Callback);
cv::imshow("image",img);
char key = cv::waitKey(0);
if(key==27)
{
cv::destroyAllWindows();
}
return 0;
}
在运行了前两,三次单击后,我得到了正确的输出。
谢谢。
答案 0 :(得分:2)
实际问题位于mouse_Callback(...)
函数中,更具体地说:
cv::Vec3b vec = img.at<cv::Vec3b>(x, y);
通过查看.at
运算符上的OpenCV文档,我们看到,第一个参数表示行索引,第二个参数表示列索引。现在,当您使用图像坐标(x, y)
时,例如通过鼠标单击获取图像,然后x
对应于列索引,y
对应于行索引!
因此,简单的解决方法就是切换x
和y
:
cv::Vec3b vec = img.at<cv::Vec3b>(y, x);