这是我的第一篇文章,如果我错过了什么,请原谅我。
我一直在用 Visual Studio C++ 玩 OpenCV2。我有一个基本的对象跟踪器工作。通过应用高斯模糊、转换为 HSV、使用 Trackbars 进行阈值化、腐蚀然后膨胀。现在我想设置一些方法来轻松校准要阈值的颜色,而无需使用 Trackbars。我尝试建立一个感兴趣的区域并获取平均 BGR 或 HSV 值(我尝试了两种方法)。然后,如果需要,使用轨迹栏进行更精细的调整,但它似乎不起作用。我在正确的轨道上,还是有更好的方法?
我基本上已经按照这个视频到达了我的位置。 https://www.youtube.com/watch?v=bSeFrPrqZ2A
我不是在寻找要复制和粘贴的代码。我只是在寻找一种算法或一种方法的解释。干杯
编辑
对不起,我会尝试清除它。我所做的是为家用机器人视觉项目编写了一个对象跟踪程序。我只是想让校准要阈值的颜色变得更容易。目前我使用轨迹栏来设置阈值的最小和最大 HSV 值。然后使用 Erode 和 Dilate 清除二值图像。在使用 cv::findConturs 和 cv::moments 找到最大轮廓的质心之前。我尝试的是在屏幕中央设置一个 40x40 像素的小方块。例如,当我在这个方格中拿着一个绿球并按下空格键时。我循环遍历正方形中的每个像素,并获得每个单独的色相、饱和度和值嗯...值。然后采用每个模式并使用它来设置最小和最大阈值。
这是一段代码
if(cv::waitKey(20) == 32){ // 等待空格键
int count = 0;
cv::Mat roi_Crop = frame_HSV(roi); //create cropped image from frame_HSV
for(int i=0; i<roi_Crop.rows; i++) // cycle through each pixel
{
for(int j=0; j<roi_Crop.cols; j++)
{
Hue[count] = roi_Crop.at<cv::Vec3b>(i,j)[0];
Sat[count] = roi_Crop.at<cv::Vec3b>(i,j)[1];
Val[count] = roi_Crop.at<cv::Vec3b>(i,j)[2];
count++;
}
}
HSV_Mode[0] = findMode(Hue);
HSV_Mode[1] = findMode(Sat);
HSV_Mode[2] = findMode(Val);
}
我希望这有帮助。