Jetson & 머신러닝

젯슨나노(Jetson nano) OpenCV4 설치 오류 수정

아크리엑터 2020. 7. 5. 17:43
반응형

 




아직 수정중...

 

 

 

젯슨나노에 Darknet 설치를 할 때, OpenCV4를 사용할 때 오류가 나는데, 이를 해결하는 방법을 찾아보았다.

 

우선 OpenCV4를 설치하는 방법은 아래와 같이 설치할 수 있다. 

 

https://pysource.com/2019/08/26/install-opencv-4-1-on-nvidia-jetson-nano/

Install Opencv 4.1 on Nvidia Jetson Nano - Pysource

We’re going to learn in this tutorial how to install Opencv 4.1 on the Nvidia Jetson Nano. First of all we need...

pysource.com

 

 

하지만, 아래의 절차대로 따라 했을 경우, cmake실행할 때, 오류가 발생한다. 소스와 설치폴더가 동일하다는 메시지가 나오면서 더이상 진행이 되지 않는다. 분명히, release폴더를 만들라고 해서 그대로 만들어서 했는데, 이상한 아래의 메시지가 나오길래, 해당 파일(CMakeLists.txt)를 열어서 확인하니, 소스폴더와 설치폴더가 동일해서 발생되는 것임을 알았다.

FATAL: In-source builds are not allowed.
       You should create a separate directory for build files.

 

그래서, opencv4의 홈에 있는 CMakeLists.txt 파일을 수정해주었다.(11번째 라인에 아래 라인 추가하였다)

set(CMAKE_BINARY_DIR "${CMAKE_BINARY_DIR}/release")

 

 

   1 # ----------------------------------------------------------------------------
   2 #  Root CMake file for OpenCV
   3 #
   4 #    From the off-tree build directory, invoke:
   5 #      $ cmake <PATH_TO_OPENCV_ROOT>
   6 #
   7 # ----------------------------------------------------------------------------
   8 
   9 # Disable in-source builds to prevent source tree corruption.
  10 
  11 set(CMAKE_BINARY_DIR "${CMAKE_BINARY_DIR}/release")
  12 if(" ${CMAKE_SOURCE_DIR}" STREQUAL " ${CMAKE_BINARY_DIR}")
  13   message(STATUS  ${CMAKE_SOURCE_DIR} "   " ${CMAKE_BINARY_DIR})
  14   message(FATAL_ERROR "
  15 FATAL: In-source builds are not allowed.
  16        You should create a separate directory for build files.
  17 ")
  18 endif()

 

위의 링크 동영상에서는 OpenCV4.1.0 으로 설명하였는데, 나는 OpenCV4.2.0 으로 컴파일을 진행하였다. 특별히 차이는 없었다.

OpenCV4의 홈  폴더에서 아래와 같이 make를 실행하여 컴파일을 한다. 컴파일 하는데 한참 걸린다. 30분 정도 걸렸나?!!! 아니, 1시간 정도 걸린 것 같다.

make -j4

 

sudo make install

 

 

 

commit 6fac225de0575b18550f9421196f90a2279c44af
Author: Tiago Koji Castro Shibata <tiago.shibata@gmail.com>
Date:   Fri Dec 28 23:13:14 2018 -0200

    Fix compilation with latest OpenCV
    
    C APIs were removed and must be replaced with C++ calls

diff --git a/Makefile b/Makefile
index 63e15e6..c148d4b 100644
--- a/Makefile
+++ b/Makefile
@@ -42,8 +42,8 @@ CFLAGS+=$(OPTS)
 ifeq ($(OPENCV), 1) 
 COMMON+= -DOPENCV
 CFLAGS+= -DOPENCV
-LDFLAGS+= `pkg-config --libs opencv` -lstdc++
-COMMON+= `pkg-config --cflags opencv` 
+LDFLAGS+= `pkg-config --libs opencv 2> /dev/null || pkg-config --libs opencv4` -lstdc++
+COMMON+= `pkg-config --cflags opencv 2> /dev/null || pkg-config --cflags opencv4`
 endif
 
 ifeq ($(GPU), 1) 
diff --git a/src/image_opencv.cpp b/src/image_opencv.cpp
index 7511280..0109fad 100644
--- a/src/image_opencv.cpp
+++ b/src/image_opencv.cpp
@@ -9,30 +9,36 @@ using namespace cv;
 
 extern "C" {
 
-IplImage *image_to_ipl(image im)
+Mat image_to_mat(image im)
 {
+    assert(im.c == 3 || im.c == 1);
     int x,y,c;
-    IplImage *disp = cvCreateImage(cvSize(im.w,im.h), IPL_DEPTH_8U, im.c);
-    int step = disp->widthStep;
+    image copy = copy_image(im);
+    constrain_image(copy);
+    if(im.c == 3) rgbgr_image(copy);
+    unsigned char *data = (unsigned char *)malloc(im.w * im.h * im.c);
     for(y = 0; y < im.h; ++y){
         for(x = 0; x < im.w; ++x){
             for(c= 0; c < im.c; ++c){
-                float val = im.data[c*im.h*im.w + y*im.w + x];
-                disp->imageData[y*step + x*im.c + c] = (unsigned char)(val*255);
+                float val = copy.data[c*im.h*im.w + y*im.w + x];
+                data[y*im.w*im.c + x*im.c + c] = (unsigned char)(val*255);
             }
         }
     }
-    return disp;
+    Mat m(im.h, im.w, CV_MAKETYPE(CV_8U, im.c), data);
+    free_image(copy);
+    free(data);
+    return m;
 }
 
-image ipl_to_image(IplImage* src)
+image mat_to_image(Mat m)
 {
-    int h = src->height;
-    int w = src->width;
-    int c = src->nChannels;
+    int h = m.rows;
+    int w = m.cols;
+    int c = m.channels();
     image im = make_image(w, h, c);
-    unsigned char *data = (unsigned char *)src->imageData;
-    int step = src->widthStep;
+    unsigned char *data = (uint8_t*)m.data;
+    int step = m.step;
     int i, j, k;
 
     for(i = 0; i < h; ++i){
@@ -42,26 +48,6 @@ image ipl_to_image(IplImage* src)
             }
         }
     }
-    return im;
-}
-
-Mat image_to_mat(image im)
-{
-    image copy = copy_image(im);
-    constrain_image(copy);
-    if(im.c == 3) rgbgr_image(copy);
-
-    IplImage *ipl = image_to_ipl(copy);
-    Mat m = cvarrToMat(ipl, true);
-    cvReleaseImage(&ipl);
-    free_image(copy);
-    return m;
-}
-
-image mat_to_image(Mat m)
-{
-    IplImage ipl = m;
-    image im = ipl_to_image(&ipl);
     rgbgr_image(im);
     return im;
 }
@@ -72,9 +58,9 @@ void *open_video_stream(const char *f, int c, int w, int h, int fps)
     if(f) cap = new VideoCapture(f);
     else cap = new VideoCapture(c);
     if(!cap->isOpened()) return 0;
-    if(w) cap->set(CV_CAP_PROP_FRAME_WIDTH, w);
-    if(h) cap->set(CV_CAP_PROP_FRAME_HEIGHT, w);
-    if(fps) cap->set(CV_CAP_PROP_FPS, w);
+    if(w) cap->set(CAP_PROP_FRAME_WIDTH, w);
+    if(h) cap->set(CAP_PROP_FRAME_HEIGHT, w);
+    if(fps) cap->set(CAP_PROP_FPS, w);
     return (void *) cap;
 }
 
@@ -121,9 +107,9 @@ int show_image_cv(image im, const char* name, int ms)
 
 void make_window(char *name, int w, int h, int fullscreen)
 {
-    namedWindow(name, WINDOW_NORMAL); 
+    namedWindow(name, WINDOW_NORMAL);
     if (fullscreen) {
-        setWindowProperty(name, CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
+        setWindowProperty(name, WND_PROP_FULLSCREEN, WINDOW_FULLSCREEN);
     } else {
         resizeWindow(name, w, h);
         if(strcmp(name, "Demo") == 0) moveWindow(name, 0, 0);


한번의 광고 클릭이 저에게 도움을 줍니다. 감사합니다.

반응형