我是OpenCV的新手。
我需要通过获取轮廓来检测和跟踪图像中的彩色LED。 我将我的图像转换为HSV来实现这一目标。
唯一的问题是我的傻瓜相机的分辨率为176x144像素,并且噪音很大。
这是我得到的输出:
http://imagizer.imageshack.us/v2/766x431q90/r/661/HQSD1L.jpg
我使用的代码:
int main () {
// Create HSV track-bar
cv::namedWindow("track-bar");
cv::createTrackbar("H max", "track-bar", &maxH, 255);
cv::createTrackbar("H min", "track-bar", &minH, 255);
cv::createTrackbar("S max", "track-bar", &maxS, 255);
cv::createTrackbar("S min", "track-bar", &minS, 255);
cv::createTrackbar("V max", "track-bar", &maxV, 255);
cv::createTrackbar("V min", "track-bar", &minV, 255);
cv::resizeWindow("track-bar", 0, 0);
cv::Mat img;
cv::VideoCapture cap(0);
while (true)
{
// Get capture
cap >> img;
// Declaration of hsv image
cv::Mat hsv;
cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV_FULL);
// Binalize
cv::Mat binalized;
cv::Scalar lower(minH, minS, minV);
cv::Scalar upper(maxH, maxS, maxV);
cv::inRange(hsv, lower, upper, binalized);
// Show result
cv::imshow("binalized", binalized);
// Detect contours
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
// Find largest contour
int contour_index = -1;
double max_area = 0.0;
for (size_t i = 0; i < contours.size(); i++) {
double area = fabs(cv::contourArea(contours[i]));
if (area > max_area) {
contour_index = i;
max_area = area;
}
}
// Object detected
if (contour_index >= 0) {
// Moments
cv::Moments moments = cv::moments(contours[contour_index], true);
double marker_y = (int)(moments.m01 / moments.m00);
double marker_x = (int)(moments.m10 / moments.m00);
// Show X by Y location
cout << "X:" << marker_x << " Y:" << marker_y << endl;
// Show result
cv::Rect rect = cv::boundingRect(contours[contour_index]);
cv::rectangle(img, rect, cv::Scalar(0, 255, 0));
}
// Show output
cv::imshow("image", img);
cv::waitKey(33);
}
我试过cv::fastNlMeansDenoisingColoredMulti()
但没有成功。
有什么想法吗?
答案 0 :(得分:4)
看到您的输入图像,问题是由于饱和度,LED中心的颜色信息完全丢失:那里有白色像素。
因此,您应首先检测饱和像素斑点(可能转换为灰度,然后阈值具有相当高的阈值)。然后,如果您还需要了解LED的颜色,则应分析找到的blob周围的halo。