2012-07-30 58 views
4

我試圖在CentOS 5.8安裝OpenCV 2.4.2,但我得到以下錯誤OpenCV的錯誤時,令CentOS

[ 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 

我的cmake上運行以下命令

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

謝謝。

+0

你有最新的make和gcc嗎? – Sam 2012-07-30 16:20:08

+0

是的,一切都是最新版本。 – 2012-07-30 16:35:23

回答

4

問題已解決。

我申請下面的補丁到〜/下載/ OpenCV的-2.4.2 /模塊/ 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; 
+0

這個工作,但如果是在更多的Linux補丁友好格式(如diff-up或uprN)和一些評論會很好。你有沒有提交給OpenCV? – CrackerJack9 2012-08-18 20:40:17