Перейти к содержимому
Compvision.ru

astrgan

Пользователи
  • Количество публикаций

    35
  • Зарегистрирован

  • Посещение

  • Days Won

    2

Сообщения, опубликованные пользователем astrgan


  1. С помощью этого кода хочу подготовить картинки для обучения нейросети.

    
    #include <opencv2/core/core.hpp>
    
    #include <opencv2/highgui/highgui.hpp>
    
    #include <opencv2/imgproc/imgproc.hpp>
    
    #include <vector>
    
    #include <iostream>
    
    #include <sstream>
    
    
    int main()
    
    {
    
        std::vector<cv::Vec3f> vecCircles;
    
        std::vector<cv::Vec3f>::iterator itrCircles;
    
    
        cv::VideoCapture  capWebcam;
    
        cv::Mat matOriginal,matProcessed;
    
        int name = 0;
    
        std::string path = "/home/alex/development/";
    
    
        std::vector<int> compression_params;                    //vector that stores the compression parameters of the image
    
        compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);  //specify the compression technique
    
        compression_params.push_back(98);                       //specify the compression quality
    
    
        capWebcam.open(0);
    
    
        while(1){
    
            capWebcam.read(matOriginal);
    
            cv::inRange(matOriginal, cv::Scalar(0,0,175), cv::Scalar(100,100,256),matProcessed);
    
            cv::HoughCircles(matProcessed, vecCircles, CV_HOUGH_GRADIENT, 2, matProcessed.rows / 4,100,50,10,400);
    
    
            for (itrCircles = vecCircles.begin(); itrCircles != vecCircles.end(); itrCircles++){
    
                int x = (int)(*itrCircles)[0];
    
                int y = (int)(*itrCircles)[1];
    
                int w = 2*(int)(*itrCircles)[2];
    
                int h = 2*(int)(*itrCircles)[2];
    
                cv::Rect rect(x-w/2,y-h/2,w,h);
    
                cv::rectangle(matProcessed, rect, cv::Scalar(0,0,255), 3);
    
                cv::rectangle(matOriginal, rect, cv::Scalar(0,0,255), 3);
    
                std::ostringstream out;
    
    
                out<<path<<name<<".jpg";
    
                cv::imwrite(out.str(), cv::Mat(matOriginal,rect),compression_params);
    
                std::cout<<"save: "<< out.str() <<std::endl;
    
                name++;
    
            }
    
    
            cv::imshow("matProcessed",matProcessed);
    
            cv::imshow("matOriginal",matOriginal);
    
            cv::waitKey(35);
    
    
        }
    
    }
    
    

    Но бывает вылетает это

    5401086_s.png


  2. Если использовать OpenCV совместно с Qt, то без подобного преобразования не обойтись?

    QImage mat2qimage(const cv::Mat& mat) {
    
        cv::Mat rgb;
    
        cv::cvtColor(mat, rgb, CV_BGR2RGB);
    
        return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888);
    
    };

    P.S. не нравится что приходится применять cvtColor(mat, rgb, CV_BGR2RGB), кажется что на ровном месте производительность буду терять.


  3. Хмм.

    В примерах которые идут с библиотекой OpenCV есть два исходника которые демонстрируют работу каскада Хаара (находятся и обводятся в круг глаза и лицо).

    Это objectDetection2.cpp и objectDetection.cpp.

    Пример objectDetection.cpp безбожно тормозит, а objectDetection2.cpp летает.

    Я почему-то всегда запускал objectDetection.cpp и мучился)


  4. Здравствуйте.

    Пытаюсь обучить каскад с помощью программы opencv_traincascade.exe, но она выдает ошибку)

    Parameters can not be written, because file haarcascade/params.xml can not be opened.

    Никак не могу понять в чем дело.

    Запускаю вот так:

    opencv_traincascade.exe -data haarcascade -vec samples.vec -bg Bad.dat -numStages 16 -minhitrate 0.999 -maxFalseAlarmRate 0.4 -numPos 200 -numNeg 500 -w 20 -h 20 -mode ALL -precalcValBufSize 1024 -precalcIdxBufSize 1024


  5. Здравствуйте

    Запустил пример который идет вместе с библиотекой Object Detection.

    Ищет лица, глаза и обводит их синим кругом.

    Вообщем все нечего и даже работает, вот только какой-то он тормознутый, видео отстает где-то на 2 сек.

    Это так и должно быть?

    Каскады на androide вроде быстрее работают, может рисование кругов замедляет его работу?


  6. Получилось сделать так:

        public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    
        	Mat rgbaInnerWindow;
    
    
        	Mat mIntermediateMat= new Mat();
    
            Mat rgba = inputFrame.rgba();
    
            Size sizeRgba = rgba.size();
    
            int rows = (int) sizeRgba.height;
    
            int cols = (int) sizeRgba.width;
    
    
            int left = cols / 8;
    
            int top = rows / 8;
    
    
            int width = cols * 3 / 4;
    
            int height = rows * 3 / 4;
    
    
            rgbaInnerWindow = rgba.submat(top, top + height, left, left + width);
    
            Imgproc.cvtColor(rgbaInnerWindow, mIntermediateMat, Imgproc.COLOR_RGBA2GRAY);
    
            Imgproc.cvtColor(mIntermediateMat, rgbaInnerWindow, Imgproc.COLOR_GRAY2BGRA);
    
            rgbaInnerWindow.release();
    
    
            return rgba;
    
    }

    Но вроде раньше получалось сделать это как-то по проще (меньше строк) в вер 4.2.3, хотя может просто я ошибаюсь и делал также.

    • Like 1

  7. Canny сделать получилось (собственно я его скопировал)

    	Mat rgbaInnerWindow;
    
    
        	Mat mIntermediateMat= new Mat();
    
            Mat rgba = inputFrame.rgba();
    
            Size sizeRgba = rgba.size();
    
            int rows = (int) sizeRgba.height;
    
            int cols = (int) sizeRgba.width;
    
    
            int left = cols / 8;
    
            int top = rows / 8;
    
    
            int width = cols * 3 / 4;
    
            int height = rows * 3 / 4;
    
    
            rgbaInnerWindow = rgba.submat(top, top + height, left, left + width);
    
            Imgproc.Canny(rgbaInnerWindow, mIntermediateMat, 80, 90);
    
            Imgproc.cvtColor(mIntermediateMat, rgbaInnerWindow, Imgproc.COLOR_GRAY2BGRA, 4);
    
            rgbaInnerWindow.release();
    
    
            return rgba; 
    А вот чернобелое неработает, не могу понять почему
    Mat rgbaInnerWindow;
    
    
        	Mat mIntermediateMat= new Mat();
    
            Mat rgba = inputFrame.rgba();
    
            Size sizeRgba = rgba.size();
    
            int rows = (int) sizeRgba.height;
    
            int cols = (int) sizeRgba.width;
    
    
            int left = cols / 8;
    
            int top = rows / 8;
    
    
            int width = cols * 3 / 4;
    
            int height = rows * 3 / 4;
    
    
            rgbaInnerWindow = rgba.submat(top, top + height, left, left + width);
    
    
            Imgproc.cvtColor(rgbaInnerWindow, rgbaInnerWindow, Imgproc.COLOR_RGBA2GRAY, 1);
    
            rgbaInnerWindow.release();
    
    
            return rgba;


  8. Здравствуйте.

    Как перевести roi в серые полутона(android)?

    Пробовал так, но не получается.

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

    Mat image = inputFrame.rgba();

    Rect roi = new Rect(300, 50, 50, 10);

    Mat sub =image.submat(roi);

    Imgproc.cvtColor(sub, sub, Imgproc.COLOR_RGBA2GRAY);

    sub.copyTo(image.submat(roi));

    return image;

    }

    и так:

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

    Mat image = inputFrame.rgba();

    Rect roi = new Rect(300, 50, 50, 10);

    Imgproc.cvtColor(image.submat(roi), image.submat(roi), Imgproc.COLOR_RGBA2GRAY);

    return image;

    }

    P.S. самое обидное это то что раньше я знал как это делать(


  9. А поверхность вывода прописана в xml?

    Что и где мне надо подправить если я хочу выводить на экран не все картинку, а только некоторую ее часть (например 1/3 от размера оригинала).


  10. А вообще если я хочу скопировать некую прямоугольную часть изображения в др. экземпляр класса mat, то такой код верен?

    
    Rect roi = new Rect(300, 50, 50, 10);
    
    imageRIO = image.submat(roi);
    или так:
    
    Rect roi = new Rect(300, 50, 50, 10);
    
    imageRIO.copyTo(image.submat(roi));


  11. Хочу обрезать изображение и вывести его на экран.

    Пытаюсь сделать так:

    
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    
        	Mat roiM = inputFrame.gray();
    
        	Rect roi = new Rect(300, 50, 50, 10);
    
        	return roiM.submat(roi);
    
        }

    но приложение не работает(

    Подскажите пожалуйста как сделать правильно.

    P.S. переделываю стандартный пример "tutorial-1-camerapreview"


  12. Подскажите пожалуйста.

    Как я понимаю программа начинается с метода .

    mOpenCvCameraView.setCvCameraViewListener(this);

    это установка "слушителя" который будет следить за изменением чего-то. Если так, то где обработчик.

    В общем если не трудно объясните в каком порядке будут вызывается методы или хотя бы что будет работать после метода onCreate.

    
    public class Tutorial1Activity extends Activity implements CvCameraViewListener2 {
    
        private static final String TAG = "OCVSample::Activity";
    
    
        private CameraBridgeViewBase mOpenCvCameraView;
    
        private boolean              mIsJavaCamera = true;
    
        private MenuItem             mItemSwitchCamera = null;
    
    
        private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    
            @Override
    
            public void onManagerConnected(int status) {
    
                switch (status) {
    
                    case LoaderCallbackInterface.SUCCESS:
    
                    {
    
                        Log.i(TAG, "OpenCV loaded successfully");
    
                        mOpenCvCameraView.enableView();
    
                    } break;
    
                    default:
    
                    {
    
                        super.onManagerConnected(status);
    
                    } break;
    
                }
    
            }
    
        };
    
    
        public Tutorial1Activity() {
    
            Log.i(TAG, "Instantiated new " + this.getClass());
    
        }
    
    
        /** Called when the activity is first created. */
    
        @Override
    
        public void onCreate(Bundle savedInstanceState) {
    
            Log.i(TAG, "called onCreate");
    
            super.onCreate(savedInstanceState);
    
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    
    
            setContentView(R.layout.tutorial1_surface_view);
    
    
            if (mIsJavaCamera)
    
                mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view);
    
            else
    
                mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_native_surface_view);
    
    
            mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
    
    
            mOpenCvCameraView.setCvCameraViewListener(this);
    
        }
    
    
        @Override
    
        public void onPause()
    
        {
    
            super.onPause();
    
            if (mOpenCvCameraView != null)
    
                mOpenCvCameraView.disableView();
    
        }
    
    
        @Override
    
        public void onResume()
    
        {
    
            super.onResume();
    
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
    
        }
    
    
        public void onDestroy() {
    
            super.onDestroy();
    
            if (mOpenCvCameraView != null)
    
                mOpenCvCameraView.disableView();
    
        }
    
    
        @Override
    
        public boolean onCreateOptionsMenu(Menu menu) {
    
            Log.i(TAG, "called onCreateOptionsMenu");
    
            mItemSwitchCamera = menu.add("Toggle Native/Java camera");
    
            return true;
    
        }
    
    
        @Override
    
        public boolean onOptionsItemSelected(MenuItem item) {
    
            String toastMesage = new String();
    
            Log.i(TAG, "called onOptionsItemSelected; selected item: " + item);
    
    
            if (item == mItemSwitchCamera) {
    
                mOpenCvCameraView.setVisibility(SurfaceView.GONE);
    
                mIsJavaCamera = !mIsJavaCamera;
    
    
                if (mIsJavaCamera) {
    
                    mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view);
    
                    toastMesage = "Java Camera";
    
                } else {
    
                    mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_native_surface_view);
    
                    toastMesage = "Native Camera";
    
                }
    
    
                mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
    
                mOpenCvCameraView.setCvCameraViewListener(this);
    
                mOpenCvCameraView.enableView();
    
                Toast toast = Toast.makeText(this, toastMesage, Toast.LENGTH_LONG);
    
                toast.show();
    
            }
    
    
            return true;
    
        }
    
    
        public void onCameraViewStarted(int width, int height) {
    
        }
    
    
        public void onCameraViewStopped() {
    
        }
    
    
        public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    
            return inputFrame.rgba();
    
        }
    
    }
    
    

×