4

I am trying to install OpenCV 2.4.2 on CentOS 5.8 but I get the following error

[ 34%] Built target opencv_test_highgui
[ 34%] Building CXX object modules/features2d/CMakeFiles/opencv_features2d.dir/src/freak.cpp.o
/home/jtrinidad/Downloads/OpenCV-2.4.2/modules/core/include/opencv2/core/core.hpp:1286: warning: ‘class cv::_InputArray’ has virtual functions but non-virtual destructor
/home/jtrinidad/Downloads/OpenCV-2.4.2/modules/core/include/opencv2/core/core.hpp:1365: warning: ‘class cv::_OutputArray’ has virtual functions but non-virtual destructor
/home/jtrinidad/Downloads/OpenCV-2.4.2/modules/features2d/src/freak.cpp: In member function ‘virtual void cv::FREAK::computeImpl(const cv::Mat&, std::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> >&, cv::Mat&) const’:
/home/jtrinidad/Downloads/OpenCV-2.4.2/modules/features2d/src/freak.cpp:367: error: shift must be an immediate
make[2]: *** [modules/features2d/CMakeFiles/opencv_features2d.dir/src/freak.cpp.o] Error 1
make[1]: *** [modules/features2d/CMakeFiles/opencv_features2d.dir/all] Error 2
make: *** [all] Error 2

I ran the following command on cmake

 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_EXAMPLES=OFF WITH_CUDA=OFF ..     

Thank you.

arrowd
  • 33,231
  • 8
  • 79
  • 110
dead_jake
  • 523
  • 2
  • 12
  • 30

3 Answers3

4

The problem was resolved.

I applied the following patch to ~/Downloads/OpenCV-2.4.2/modules/features2d/src/freak.cpp

diff -crB OpenCV-2.4.2.orig/modules/features2d/src/freak.cpp OpenCV-2.4.2/modules/features2d/src/freak.cpp
*** OpenCV-2.4.2.orig/modules/features2d/src/freak.cpp  2012-07-25 09:54:50.000000000 -0400
--- OpenCV-2.4.2/modules/features2d/src/freak.cpp   2012-07-24 10:34:57.000000000 -0400
***************
*** 364,370 ****
        __m128i workReg = _mm_min_epu8(operand1, operand2); // emulated "not less than" for 8-bit UNSIGNED integers
        workReg = _mm_cmpeq_epi8(workReg, operand2);        // emulated "not less than" for 8-bit UNSIGNED integers

!                     workReg = _mm_and_si128(_mm_srli_epi16(binMask, m), workReg); // merge the last 16 bits with the 128bits std::vector until full
        result128 = _mm_or_si128(result128, workReg);
        }
        (*ptr) = result128;
--- 364,404 ----
        __m128i workReg = _mm_min_epu8(operand1, operand2); // emulated "not less than" for 8-bit UNSIGNED integers
        workReg = _mm_cmpeq_epi8(workReg, operand2);        // emulated "not less than" for 8-bit UNSIGNED integers

!                     // merge the last 16 bits with the 128bits std::vector until full
!                     __m128i shiftedMask;
!           switch(m) {
!               case 8:
!               shiftedMask = _mm_srli_epi16(binMask, 8);
!               break;
!               case 7:
!               shiftedMask = _mm_srli_epi16(binMask, 7);
!               break;
!               case 6:
!               shiftedMask = _mm_srli_epi16(binMask, 6);
!               break;
!               case 5:
!               shiftedMask = _mm_srli_epi16(binMask, 5);
!               break;
!               case 4:
!               shiftedMask = _mm_srli_epi16(binMask, 4);
!               break;
!               case 3:
!               shiftedMask = _mm_srli_epi16(binMask, 3);
!               break;
!               case 2:
!               shiftedMask = _mm_srli_epi16(binMask, 2);
!               break;
!               case 1:
!               shiftedMask = _mm_srli_epi16(binMask, 1);
!               break;
!               case 0:
!               shiftedMask = _mm_srli_epi16(binMask, 0);
!               break;
!           default:
!               throw "shifting less than 0";
!                     }
!                     workReg = _mm_and_si128(shiftedMask, workReg); 
! 
        result128 = _mm_or_si128(result128, workReg);
        }
        (*ptr) = result128;
dead_jake
  • 523
  • 2
  • 12
  • 30
  • this worked, but would be nice it if was in a more linux patch friendly format (like with diff -up or uprN) and some comments. have you submitted this to OpenCV? – CrackerJack9 Aug 18 '12 at 20:40
0

After trying to use patches, I resorted to compile freak.cpp manually. My notes on the installation are available here: http://www.megalinux.net/compiling-opencv-2-4-on-rhelcentos-5/

Ram Prasad
  • 396
  • 2
  • 11