2016년 12월 8일 목요일

OpenCV Lecture 1-2, How to start OpenCV, download & setting

1. Contents
  • OpenCV 사용 방법
    • 다운 받는 방법, 간단하게 사용해보기
    • 영상, webcam 뿌려보기

      2. PPT
      •  


      3. Video


          4. Reference

          5. source code
            ① Video capture 기본 실습 코드
          • < gist > < /gist>


          #Tags for search
          VideoCapture, isOpened, empty, Sobel

          댓글 33개:

          1. opencv cv 빌드한 것을 공유하고 있습니다.
            http://cvlecture.marearts.com/2016/12/opencv-build-shared-opencv.html

            답글삭제
          2. 안녕하십니까 영상 따라가면서 재미있게 공부하고 있습니다.

            코딩중 막히는 부분이 있어서 댓글올립니다.

            영상에서 11:50 구간 즈음에 opencv 속성을 설정해준다음
            #include 을 추가 하셧는데

            저같은 경우에는
            #include 를 할 경우 cannot find open source file 로 error가 발생합니다.

            위와같은상황에서 어떻게해야할지 알려주시면 감사하겠습니다.

            환경은 visual studio 2013, windows 7, 64bit 이며
            영상과 같이 opencv2.4.13버전 다운 후 VC12를 택하였습니다.(영상과 동일)

            답글삭제
            답글
            1. 제 생각에는 포함디렉토리 경로 설정이 잘 안된 것 같네요.
              include 할때, 헤더 파일의 vs가 위치를 몰라서 나는 에러인 것 같습니다.
              다시 한반 체크해 보시겠어요?

              삭제
            2. 네 그렇게 해보겠습니다!

              삭제
            3. 언급해주신부분 제대로해결하였습니다. 파일위치입력 시에 ok를 안눌렀습니다.
              감사합니다!!
              그런데 여전히문제가잇습니다...

              카메라는 유에스비연결방식으로 2.0포트에 연결된 상태입니다. (혹시 포트설정을 해줘야아하나요?)

              (16:02 참고) system 파일에 dll 파일들도 복사하여 주었고
              debug하는데 문제가없습니다.

              하지만
              Unhandled exception at 0x000007FEFD3BA06D in opencvtest.exe: Microsoft C++ exception: cv::Exception at memory location 0x00000000001FF560.
              이라는 오류가 발생하고 break 및 continue 등이 있습니다.

              다시한번 위와같은상황에서 어떻게해야할지 알려주시면 감사하겠습니다!

              삭제
            4. 포트 설정은 따로 없고요, 빌드는 성공했는데 실행하면 발생하나요? 에러는 메모리 에러네요 vidiocapture 인덱스를 0으로 하셨나요?

              삭제
            5. 답글 감사드립니다! 빌드 성공 후 실행 시 발생합니다. videocapture index 0설정 부분은 잘모르겠습니다...영상에 언급되있는 부분인가요? 제가 놓친것 같습니다.. 도와주신다면 감사하겠습니다^^!!

              삭제
            6. VideoCapture cap(0); -> 여기에 0을 말씀드렸습니다.
              컴퓨터에 연결된 캠이 2개면 0,1 이렇게 인덱스로 선택적으로 접근 할 수 있습니다.
              그런데 캠이 1개 연결되어 있는데 1이라고 쓰면 에러가 날 수 있어서 체크해보시길 바랍니다.
              github 사용하시나요? github에 gist라는 것에 코드를 올리고 주소를 알려주시면 코드를 제가 체크해 보겠습니다. 감사합니다.

              삭제
            7. 언급하신 부분 수정 후 코드 정상 작동하엿습니다. 다음 강의 들어보도록하겠습니다! 감사합니다~

              삭제
          3. 안녕하세요. 아직 강의 초반이지만 뭔가 쉽게 와 닿는것 같고 이해도 잘되는 강의해 주셔서 감사합니다. 다만 비주얼스투디오 2015버전으로 따라하고 있는데 헤더파일부분에서 막히는데 2015버전이여서 그런건가요? 헤더 폴더 때문에 다음과 같은 오류가 뜹니다.
            'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
            그래서 예제에서 사용되는 헤더파일을 가져와서 실행해보면 실행은 되는데 영상이 나옴과 동시에 바로 꺼져버립니다. 혹시 조언을 얻을 수 있을까요? 감사합니다!

            답글삭제
            답글
            1. 저 문제는 해결했는데 이제 비디오가 아닌 이미지로 출력만 되요ㅠ

              삭제
            2. 위 문제는 fopen 함수 대신 fopen_s 함수로 바꿔 사용하거나
              프로젝트 속성 -> c/c++ -> 전처리기 -> 전처리기 정의에 _CRT_SECURE_NO_WARNINGS 를 추가해 주면 됩니다.
              fopen_s를 사용할때는

              FILE * fp;
              fopen_s(&fp, "sss.txt", "r");
              fclose(fp);


              이런 식으로 사용해야 합니다.

              삭제
            3. 비디오가 아니라 이미지로 출력된다는게 어떤 것인지 모르겠네요.
              github gist에 코드를 올려 주실 수 있나요?
              아마 간단하게 해결 가능할 거예요..

              삭제
            4. 아마 opencv 3.2버전이거나 비주얼스튜디오2015 여서 그랬던거 같습니다.
              비주얼도 2013으로 다시받고 opencv도 3.1버전으로 맞추니 같은 코드로 동영상과 같이 작동되는 것 확인했습니다.
              코드는 동영상 내에서 사용하신 sobel 관련 코드 그대로 사용한 것이었습니다.

              삭제
            5. 해결 했다니 다행이네요.

              삭제
            6. 혹시 fopen 해결할 때 매번 전처리기에 들어가기 귀찮으면 다르게 해결하는 방법이 있을까요?

              삭제
            7. 아 #define _CRT_SECURE_NO_WARNINGS 이렇게 정의해주면 해결 되는군요

              삭제
            8. 네.. 맞습니다!!! 전처리기 역활이 그겁니당..

              코드에
              #ifdef _CRT_SECURE_NO_WARNINGS
              printf("_CRT_SECURE_NO_WARNINGS 가 정의됨\n")
              #endif

              이렇게 사용할 수 있습니다.
              감사합니다.
              열심히 하시네요!! 화이팅!!!

              삭제
          4. 작성자가 댓글을 삭제했습니다.

            답글삭제
          5. 안녕하세요 동영상을 보며 열심히 따라하고 있는 대학생입니다.
            현재 visual studio 2015와 opencv 3.2를 가지고 진행하고 있는데
            저도 윗분과 같이 fopen에러가 나서 말씀해주신대로 전처리기에 추가 후 fopen 문제는 해결됐습니다
            하지만 실행 중에
            "처리되지 않은 예외 발생(0x00007FF85A777788, Opencv_prac.exe): Microsoft C++ 예외: cv::Exception, 메모리 위치 0x000000E5DE14F110."
            라는 창이 뜨면서 진행이 되지 않습니다 이럴경우에는 어떻게 해결해야하나요?

            더불어서 콘솔창에서는
            "cannot open cameraOpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file C:\build\master_winpack-build-win64vc14\opencv\modules\highgui\src\window.cpp, line 304 "
            이렇게 뜹니다....

            답글삭제
            답글
            1. 안녕하세요, 에러를 보니깐 imshow 할때, mat 변수에 아무것도 없어서 생긴 것 같네요..
              if(mat.empty())
              printf("error, no data!");
              else
              printf("no problem!");

              이렇게 검사를 한번 해보세요.
              아니면 코드를 올려주시면 살펴 볼께요.
              감사합니다.


              * 코드 공유는 github gist를 사용하면 편해요.

              삭제
          6. 안녕하세요. visual studio 2017 + opencv 3.2 인데 잘되지 않아서요. 혹시 visual studio2017 은 opencv 사용을 못하나요?

            답글삭제
            답글
            1. 그렇지는 않을텐데요? 어떻게 안되나요? 혹시 x64, x86 선택을 올바로 했나요?

              삭제
          7. 'opencv_core320d.lib파일을열수 없습니다. 라고 떠요~

            답글삭제
            답글
            1. library 경로를 확인해보실래요? 설정한 경로에 그 lib를 못 찾는 것 같네요.

              삭제
          8. VideoCapture cap(0); 여기서 0을 http나 rtsp로 바꿔서 스트리밍 비디오로 openCV를 이용할 수 있나요?

            답글삭제
            답글
            1. 네 가능합니다.
              예전에 3가지 방법으로 테스트한 것이 있는데요, 코드를 참고하세요.
              http://study.marearts.com/2016/03/opencv-rtsp-receiving-test.html

              삭제
          9. 안녕하세요. 인프리런통해 수업을 너무 잘 듣고있습니다. 첫 예제 빌드를 하니 cannot open file 'opencv_core320d.lib'여서 그 경로에 가보니 330만 있고 320이나 320d파일이 없습니다...어떻게 추가할수 있나요..?

            답글삭제
            답글
            1. 저는 320 버전일때 만든 자료라서 버전이 안맞네요.
              프로젝트에 추가한 dll과 lib 이름에서 320을 모두 330으로 바꾸고 해보세요.
              감사합니다.

              삭제
            2. 아래 강로원분이 330 버전으로 소스코드를 바꾸었네요. ^^ 물론 dll은 프로젝트 속성에서 바꿔야 합니다.

              삭제
          10. 안녕하세요? 열심히 따라 하고 있습니다..

            딱 한군데 빨간 밑줄 나오면서 실행이 안 되는데요.

            #include
            #include

            #ifdef DEBUG
            #pragma comment(lib, "opencv_core330d.lib")
            #pragma comment(lib, "opencv_imgproc330d.lib")
            #pragma comment(lib, "opencv_highgui330d.lib")
            //#pragma comment(lib, "opencv_video330d.lib")
            #else
            #pragma comment(lib, "opencv_core330.lib")
            #pragma comment(lib, "opencv_imgproc330.lib")
            #pragma comment(lib, "opencv_highgui330.lib")
            #pragma comment(lib, "opencv_video330.lib")
            #endif // DEBUG


            using namespace std;
            using namespace cv;

            void main()
            {
            //cout << "hello world" << endl;
            //cout << "hello" << endl;

            //file load
            VideoCapture stream1(0); // 0 is the id of video device. 0 if you have only cne camera

            if (!stream1.isOpened()) { // check if video device has been initialised
            cout << "cnanot open camera";
            }

            namedWindow("Processing");
            namedWindow("Origin");

            //unconditional loop
            while (true) {
            Mat cameraFrame;
            stream1.read(cameraFrame); //get one frame form video
            imshow("Origin", cameraFrame);

            Sobel(cameraFrame, cameraFrame, CV_BU, 1, 0); //sobel processing
            imshow("Processing", cameraFrame);

            if (waitKey(30) >= 0)
            break;
            }

            destroyAllWindows();
            }

            위 코드에서 Sobel(..., CV_BU,...) 여기 CV_BU 아래에 빨간 밑줄이 나나오면서 실행이 안 되는데요.

            동영상에서는 CV_BU로 코딩이 되었지만..
            싸이트 내 소스 파일에는 CV_BU ===> frame.depth()로 되어 있습니다.
            그래서 CV_BU를 cameraFrame.depth()로 수정하니까...

            아주 정상적으로 작동합니다. 감사 드립니다.

            그런데.. CV_BU와 frame.depth()의 설명을 듣고 싶습니다.

            감사합니다.


            답글삭제
            답글
            1. CV_BU 가 아니라 CV_8U 입니다.
              이 부분은 뒤에서 Mat강의에서 설명이 있을 거예요..

              CV_8U, CV_8C, CV_8C2... 많은 상수들이 있는데요..
              픽셀의 속성을 말하는 것인데 CV_8U 이면 한 픽셀이 8비트 unsigned char라는 뜻이고, CV_8C 이면 한 픽셀이 8비트 signed char... 등등의 뜻입니다.
              Depth()는 같은 의미로 한 픽셀의 속성을 이들 상수 값으로 리턴해줍니다.

              이미지 관련 설명이 뒤에 있으니깐 궁금증을 조금 참고 진행해보세요.. ^^

              삭제

          OpenCV Build shared, OpenCV 빌드한 것 공유

          OpenCV 3.1 64bit build (github master downed on 2017-01-31) 64bit for window opencv contribute module 포함 cuda 8.0 tbb 2016-11-28 ( sha...