Используя cv :: Mat image (opencv), как я могу обнаружить объект?

С помощью

Mat image;

я использовал

inRange(image,Scalar(170,100,0),Scalar(255,255,70),image);

и я обнаруживаю объект синим цветом, но я не могу нарисовать прямоугольник вокруг объекта.

Должен ли я использовать маску? или что-то?

inRange(image,Scalar(170,100,0),Scalar(255,255,70),image);
GaussianBlur(image,image,Size(9,9),1.5);

for(int i = 2; i <image.cols-2;i++)
for(int j = 2; j <image.rows-2;j++){
if( image.at<Vec3b>(i-1,j-1)[0] > 200 &&
image.at<Vec3b>(i-1,j)[0] > 200 &&
image.at<Vec3b>(i-1,j+1)[0] > 200 &&
image.at<Vec3b>(i,j-1)[0] > 200 &&
image.at<Vec3b>(i,j)[0] > 200 &&
image.at<Vec3b>(i,j+1)[0] > 200 &&
image.at<Vec3b>(i+1,j-1)[0] > 200 &&
image.at<Vec3b>(i+1,j)[0] > 200 &&
image.at<Vec3b>(i+1,j+1)[0] > 200
)
{

if(min_x > i)
min_x = i;
if(min_y >j)
min_y = j;
if(max_x < i)
max_x =i;
if(max_y < j)
max_y = j;

}
}
if(!(max_x==0 && max_y==0 && min_x==image.rows && min_y == image.cols))
{
rectangle(image,Point(min_x,min_y),Point(max_x,max_y),CV_RGB(255,0,0),2);
}

imshow("working", image);
if(waitKey(100) >= 0) break;
}

}

Это не работает и ошибка во время выполнения.
Я не знаю почему .. помогите мне!

1

Решение

Несколько советов:

  • Ваше изображение может быть CV_8U3C, но inRange, вероятно, преобразует его в CV_8UПоэтому лучше использовать для вывода новый экземпляр Mat.

  • использование cv::findContours обнаружить вашу область.

  • Изучение meanshift используется для отслеживания OpenCV, который может вам помочь.

1

Другие решения

Вы не можете использовать изображение RGB для метода inrange. Вы должны преобразовать ваше изображение в цветовое пространство HSV и использовать диапазон оттенков синего, то есть 95-135. В пространстве RGB так много «синих» возможностей.

inRange(image,Scalar(95,0,0),Scalar(135,255,255),image);

Результатом будет двоичное изображение, просто найти контур а также нарисовать ограничивающий прямоугольник вокруг него.

1

По вопросам рекламы [email protected]