Skocz do zawartości

RPi + RPi Cam + OpenCV + C++


nowok

Pomocna odpowiedź

Witam serdecznie wszystkich, jest to moj pierwszy post na forum, mam nadzieje ze w dobrym miejscu.

Składając układ mobilny mający na celu wykrywanie kolorowego punktu lasera i podążania za nim, napotkał mnie problem.

Mam gotowy kod programu wykrywający barwę (na pc), i napotyka mnie problem przeniesienia kodu na rpi. Jestem początkujący, więc proszę o wyrozumiałość.


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

using namespace cv;
using namespace std;

int main( int argc, char** argv )
{
   VideoCapture cap(0); 

   if ( !cap.isOpened() )  
   {
        cout << "Cannot open the web cam" << endl;
        return -1;
   }

   namedWindow("Control", CV_WINDOW_AUTOSIZE); 

 int iLowH = 170;
int iHighH = 179;

 int iLowS = 150; 
int iHighS = 255;

 int iLowV = 60;
int iHighV = 255;

createTrackbar("LowH", "Control", &iLowH, 179);
createTrackbar("HighH", "Control", &iHighH, 179);

 createTrackbar("LowS", "Control", &iLowS, 255); 
createTrackbar("HighS", "Control", &iHighS, 255);

 createTrackbar("LowV", "Control", &iLowV, 255);
createTrackbar("HighV", "Control", &iHighV, 255);

 int iLastX = -1; 
int iLastY = -1;


Mat imgTmp;
cap.read(imgTmp); 


Mat imgLines = Mat::zeros( imgTmp.size(), CV_8UC3 );;


   while (true)
   {
       Mat imgOriginal;

       bool bSuccess = cap.read(imgOriginal); 



        if (!bSuccess) //if not success, break loop
       {
            cout << "Cannot read a frame from video stream" << endl;
            break;
       }

   Mat imgHSV;

  cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); 
 Mat imgThresholded;

  inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);

 erode(imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) );
 dilate( imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) ); 

 dilate( imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) ); 
 erode(imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) );

 Moments oMoments = moments(imgThresholded);

  double dM01 = oMoments.m01;
 double dM10 = oMoments.m10;
 double dArea = oMoments.m00;
because of the noise, the area is not zero 
 if (dArea > 10000)
 {

  int posX = dM10 / dArea;
  int posY = dM01 / dArea;        

  if (iLastX >= 0 && iLastY >= 0 && posX >= 0 && posY >= 0)
  {

   line(imgLines, Point(posX, posY), Point(iLastX, iLastY), Scalar(0,0,255), 2);
  }

   iLastX = posX;
  iLastY = posY;
 }

  imshow("Thresholded Image", imgThresholded);

  imgOriginal = imgOriginal + imgLines;
 imshow("Original", imgOriginal); 
       if (waitKey(30) == 27) 
break loop
      {
           cout << "esc key is pressed by user" << endl;
           break; 
      }
   }

  return 0;
}

Chciałbym zapytać czy na forum znajduje się ktoś kto miał do czynienia z opencv + rpi + c++? Lub ewentualnie potrafiłby przełożyć ten kod na pythona? Mój główny problem w c++ to uruchomienie dedykowanej kamery rpi z poziomu programu.

Pozdrawiam

Link do komentarza
Share on other sites

Ja uruchamiałem OpenCV2 na RPi z wykorzystaniem Pythona. Kod do pobierania obrazu z kamery znajdziesz w przykładzie do 'facedetect'.

Jeżeli korzystasz z kamery płytkowej to przed uruchomieniem programu pamiętaj, żeby załadować moduł do jej obsługi za pomocą komendy

sudo modprobe bcm2835-v4l2
(o ile dobrze pamiętam)
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.