Код отслеживания цветных объектов

IDE: CodeBLocks
Версия Opencv: 2.4.6
Язык: C ++

Ниже приведен код для обнаружения желтого цвета, который я смог успешно выполнить.

#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/highgui/highgui.hpp"#include <iostream>

using namespace cv;
using namespace std;Mat GetThresholdedImage(Mat image_here)
{
Mat image_here1=image_here;
cvtColor(image_here,image_here1,CV_BGR2HSV);
inRange(image_here1, Scalar(20, 100, 100), Scalar(30, 255, 255), image_here1);
return image_here1;
}int main(int argc, char* argv[])
{
VideoCapture cap(0); // open the video camera no. 0

if (!cap.isOpened())  // if not success, exit program
{
cout << "Cannot open the video cam" << endl;
return -1;
}

double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); //width of frames of ideo
double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //height of frames of the video
Mat imgtrack(dWidth,dHeight,CV_8UC3);
imgtrack.setTo(0);

cout << "Frame size : " << dWidth << " x " << dHeight << endl;

namedWindow("MyVideo",CV_WINDOW_AUTOSIZE); //create a window called "MyVideo"
while (1)
{
Mat frame;

bool bSuccess = cap.read(frame); // read a new frame from video
//imshow("MyVideo", frame);
if (!bSuccess) //if not success, break loop
{
cout << "Cannot read a frame from video stream" << endl;
break;
}Mat imgYellowThresh=GetThresholdedImage(frame);imshow("MyVideo", imgYellowThresh);cout<<endl<<"moving to imgproc";
cout<<"end";
if (waitKey(30) == 27)
{
cout << "esc key is pressed by user" << endl;
break;
}
}

return 0;

}

Ниже приведен мой код для выполнения отслеживание желтого цвета объекта. Проблема в том, что он компилируется и работает успешно, однако окно вывода, в котором должен отображаться окончательный вывод видео, не отображается, и программа неожиданно завершает работу без каких-либо ошибок или исключений и т. Д.
Я уже просмотрел довольно много других кодов и страниц, но не смог найти решение.

Я использовал учебник opencv для сборки своего кода. Поскольку код, упомянутый здесь, является стилем C, я внес некоторые свои изменения в код на C ++.
http://opencv-srf.blogspot.in/2010/09/object-detection-using-color-seperation.html

Я также добавил кучу cout’ов, таких как «запуск порога» и т. Д., Чтобы проверить проблему. Заявления до одного cout<<"\n area if starting \n"; печатаются, а остальные нет.
Кроме того, я получаю warning: unknown escape sequence: '\040' в строке с заявлением cout"\n about to add\n";,
Так как я новичок в обработке изображений и opencv, я не могу понять, как это сделать.

Пожалуйста помоги.

#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/highgui/highgui.hpp"#include <iostream>

using namespace cv;
using namespace std;

Mat imgtrack;
int lastX=-1;
int lastY=-1;

Mat GetThresholdedImage(Mat image_here)
{
Mat image_here1=image_here;
cvtColor(image_here,image_here1,CV_BGR2HSV);
inRange(image_here1, Scalar(20, 100, 100), Scalar(30, 255, 255), image_here1);
return image_here1;
}int main(int argc, char* argv[])
{
VideoCapture cap(0); // open the video camera no. 0

if (!cap.isOpened())  // if not success, exit program
{
cout << "Cannot open the video cam" << endl;
return -1;
}

double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); //width of frames of ideo
double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //height of frames of the video
Mat imgtrack(dWidth,dHeight,CV_8UC3);
imgtrack.setTo(0);

cout << "Frame size : " << dWidth << " x " << dHeight << endl;

namedWindow("MyVideo",CV_WINDOW_AUTOSIZE); //create a window called "MyVideo"
while (1)
{
Mat frame;

bool bSuccess = cap.read(frame); // read a new frame from video
//imshow("MyVideo", frame);
if (!bSuccess) //if not success, break loop
{
cout << "Cannot read a frame from video stream" << endl;
break;
}cout<<"\nstarting thresholding\n";
Mat imgYellowThresh=GetThresholdedImage(frame);
cout<<"\nDone Thresholding\n";Moments m=moments(imgYellowThresh,true);
double moment10=m.m10;
double moment01=m.m01;
double area=m.m00;

cout<<"\n area if starting\n";

if(area>1000)
{
cout<<"\n inside if\n";  //not printing any cout from here on
int posX=moment10/area;
int posY=moment01/area;
if(lastX>=0 && lastY>=0 && posX>=0 && posY>=0)
{
line(imgtrack,Point(posX,posY),Point(lastX,lastY),Scalar(255,0,0),4);
}
lastX=posX;
lastY=posY;

imshow("MyVideo", frame);add(frame,imgtrack,frame);cout<<"end";
if (waitKey(30) == 27)
{
cout << "esc key is pressed by user" << endl;
break;
}
}

return 0;

}
}

0

Решение

ты пытался:

  1. Понижение номера области
  2. Использование функции поиска контуров, а затем вычисление моментов на самом большом контуре и поиск области после этого
0

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

Других решений пока нет …

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