Witam
Staram się stworzyć aplikacje która rozpozna czy w danym momencie świeci się zielone czy czerwone światło w obrazie przechwyconym z kamery i wtedy wykona jakaś akcje . Nigdy nie używałem opencv i programista tez nie jestem. Do tej pory dość sporo już wygooglowałem aplikacja będzie działała na podobnej zasadzie opisanej w tym artykule. Wspierałem się przykładami użycia opencv z c++ pythonem i java na tyle ile bylem je wstanie zrozumieć. Obecnie aplikacja wykrywa czerwone pixele w obrazie po czym z czerwonych obszarów wychwytuje wszystkie krawędzie. Teraz staram się wykryć które krawędzie są w kształcie okręgu. Hough Circle już próbowałem nie do końca spełnił moje oczekiwania lub porostu użyłem go niewłaściwie. I właśnie z tym wykryciem okręgów nie umiem sobie poradzić. Jak już dobiorę się do tych okręgów sprawdzę który z nich ma najjaśniejsze czerwone pixele z użyciem Core.minMaxLoc(CzerwoneOkregiGrayScale);. Teoretycznie wtedy w większości przypadków program nie powinien się mylić co do rozpoznania obiektu. To nie ma być aplikacja do samochodów i zakładam ze światło będzie zawsze stało nieruchomo na środku obrazu co ułatwia sprawę. Do tego jeszcze nie doszedłem w poszukiwaniach ale później sprawdzę czy ja się zrobić zooma w opencv z kamery. Prawdopodobnie dodam maskę i kwadrat na środku ekranu który będzie wskazywał obszar zainteresowania do poszukiwań przez algorytm światła. Myślałem tez ze będę porównywać jasność pixeli na okręgu czerwonym i zielonym i w ten sposób chyba będę mógł ocenić które światło obecnie się pali. Jak ktoś ma jakieś propozycje jak się do tego zabrać i zrobić to w prosty sposób .
Edit-- Obecnie mam problem z funkcja approxPolyDP "Error:(1501, 31) error: cannot find symbol variable approxCurve" CRASH :)
Niektóre części kodu nie są używane jak mi to wkoncu wszystko zadziała to trzeba będzie przepisać jeszcze raz.
Jak wykryć kontury które maja kształt okręgu ?
Dziękuje PRZEOGROMNIE za pomoc Panowie i Panie :)
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
Imgproc.cvtColor(mRgba,imgHSV,Imgproc.COLOR_RGBA2RGB);
Imgproc.cvtColor(imgHSV,imgHSV,Imgproc.COLOR_RGB2HSV);
Imgproc.medianBlur(imgHSV,imgHSV,3);
Core.inRange(imgHSV, new Scalar(0,100,100),new Scalar(10,255,255),imgThreshold);
Core.inRange(imgHSV, new Scalar(170,100,100), new Scalar(179,255,255),imgThreshold2);
Mat red_hue_image= new Mat();
Mat red_rgb_image = new Mat();
Core.addWeighted(imgThreshold,1.0,imgThreshold2,1.0,0.0,red_hue_image);
//Mat kernel = Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(1,1));
// Imgproc.erode(red_hue_image,red_hue_image,kernel);
//Imgproc.dilate(red_hue_image,red_hue_image,kernel);
List<MatOfPoint> contoursPoints = new ArrayList<MatOfPoint>();
Mat circles = new Mat();
Mat RedEdges = new Mat();
//Mat mDilatedMask = new Mat();
// Imgproc.dilate(red_hue_image,mDilatedMask, new Mat());
Mat mHierarchy = new Mat();
// mRgba.copyTo(red_rgb_image,red_hue_image);
// Imgproc.cvtColor(red_rgb_image,red_rgb_image,Imgproc.COLOR_RGBA2GRAY);
Imgproc.Canny(red_hue_image,RedEdges,100,150);
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
List<MatOfPoint2f> contours2f = new ArrayList<MatOfPoint2f>();
Imgproc.findContours(RedEdges, contours, mHierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
MatOfPoint2f contour2f = new MatOfPoint2f();
// Find max contour area
double maxArea = 0;
Iterator<MatOfPoint> each = contours.iterator();
while (each.hasNext())
{
double aprox = 0.01*Imgproc.arcLength(contour2f,true);
MatOfPoint wrapper = each.next();
wrapper.convertTo(contour2f, CvType.CV_32F);
Imgproc.approxPolyDP(contour2f,aprox,true);
double area = Imgproc.contourArea(wrapper);
if (area > maxArea)
maxArea = area;
if(aprox>8&aprox<24&area>30){
contours2f.add(contour2f);
}
}
contours.clear();
for(MatOfPoint2f cont : contours2f){
MatOfPoint contConverted = new MatOfPoint();
cont.convertTo(contConverted,CvType.CV_32FC2);
contours.add(contConverted);
Imgproc.drawContours(mRgba,contours,-1,new Scalar(90, 90, 255));
}