OpenCV编译过程失败

时间:2017-09-12 07:04:25

标签: macos opencv ffmpeg

所以我关注如何为Python 3安装openCV this帖子。我在编译过程中遇到了一些问题。运行error: use of undeclared identifier 'avcodec_free_frame'; did you mean 'avcodec_get_name'?命令可以正常运行,直到我收到此错误消息的28%:ffmpeg

我甚至不知道从哪里开始解决这个问题。我通过brew安装了cd ~ git clone https://github.com/Itseez/opencv.git cd opencv git checkout 3.0.0 cd ~ git clone https://github.com/Itseez/opencv_contrib.git cd opencv_contrib git checkout 3.0.0 cd ~/opencv mkdir build cd build cmake CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ -D PYTHON3_LIBRARY=/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/config-3.5m/libpython3.5.dylib \ -D PYTHON3_INCLUDE_DIR=/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/include/python3.5m/ \ -D PYTHON3_EXECUTABLE=$VIRTUAL_ENV/bin/python \ -D BUILD_opencv_python2=OFF \ -D BUILD_opencv_python3=ON \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D INSTALL_C_EXAMPLES=OFF \ -D BUILD_EXAMPLES=ON .. \ -D FFMPEG_INCLUDE_DIR=/usr/local/Cellar/ffmpeg/3.3.4/include/ -D FFMPEG_LIB_DIR=/usr/local/Cellar/ffmpeg/3.3.4/lib/ -D WITH_FFMPEG=ON cmake make -j4

完整的命令列表:

FFMPEG_INCLUDE_DIR

我从这篇文章中获得了FFMPEG_LIB_DIRWITH_FFMPEG[ 28%] Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_qtkit.mm.o In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:317:9: error: use of undeclared identifier 'avcodec_free_frame'; did you mean 'avcodec_get_name'? avcodec_free_frame(&picture); ^~~~~~~~~~~~~~~~~~ avcodec_get_name /usr/local/Cellar/ffmpeg/3.3.4/include/libavcodec/avcodec.h:6289:13: note: 'avcodec_get_name' declared here const char *avcodec_get_name(enum AVCodecID id); ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:317:28: error: cannot initialize a parameter of type 'enum AVCodecID' with an rvalue of type 'AVFrame **' avcodec_free_frame(&picture); ^~~~~~~~ /usr/local/Cellar/ffmpeg/3.3.4/include/libavcodec/avcodec.h:6289:45: note: passing argument to parameter 'id' here const char *avcodec_get_name(enum AVCodecID id); ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:632:23: error: use of undeclared identifier 'avcodec_alloc_frame' picture = avcodec_alloc_frame(); ^ /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:635:41: error: use of undeclared identifier 'PIX_FMT_BGR24'; did you mean 'AV_PIX_FMT_BGR24'? avpicture_get_size( PIX_FMT_BGR24, ^~~~~~~~~~~~~ AV_PIX_FMT_BGR24 /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:65:5: note: 'AV_PIX_FMT_BGR24' declared here AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:638:29: error: use of undeclared identifier 'PIX_FMT_BGR24'; did you mean 'AV_PIX_FMT_BGR24'? PIX_FMT_BGR24, enc->width, enc->height ); ^~~~~~~~~~~~~ AV_PIX_FMT_BGR24 /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:65:5: note: 'AV_PIX_FMT_BGR24' declared here AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:738:67: error: use of undeclared identifier 'PIX_FMT_RGB24'; did you mean 'AV_PIX_FMT_RGB24'? avpicture_fill((AVPicture*)&rgb_picture, rgb_picture.data[0], PIX_FMT_RGB24, ^~~~~~~~~~~~~ AV_PIX_FMT_RGB24 /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:64:5: note: 'AV_PIX_FMT_RGB24' declared here AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB... ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:756:17: error: use of undeclared identifier 'PIX_FMT_BGR24'; did you mean 'AV_PIX_FMT_BGR24'? PIX_FMT_BGR24, ^~~~~~~~~~~~~ AV_PIX_FMT_BGR24 /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:65:5: note: 'AV_PIX_FMT_BGR24' declared here AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1110:15: error: use of undeclared identifier 'avcodec_alloc_frame' picture = avcodec_alloc_frame(); ^ /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1113:33: error: unknown type name 'PixelFormat'; did you mean 'AVPixelFormat'? size = avpicture_get_size( (PixelFormat) pix_fmt, width, height); ^~~~~~~~~~~ AVPixelFormat /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:60:6: note: 'AVPixelFormat' declared here enum AVPixelFormat { ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1122:25: error: unknown type name 'PixelFormat'; did you mean 'AVPixelFormat'? (PixelFormat) pix_fmt, width, height); ^~~~~~~~~~~ AVPixelFormat /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:60:6: note: 'AVPixelFormat' declared here enum AVPixelFormat { ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1230:19: error: unknown type name 'PixelFormat'; did you mean 'AVPixelFormat'? c->pix_fmt = (PixelFormat) pixel_format; ^~~~~~~~~~~ AVPixelFormat /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:60:6: note: 'AVPixelFormat' declared here enum AVPixelFormat { ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1405:26: error: use of undeclared identifier 'PIX_FMT_BGR24'; did you mean 'AV_PIX_FMT_BGR24'? if (input_pix_fmt == PIX_FMT_BGR24) { ^~~~~~~~~~~~~ AV_PIX_FMT_BGR24 /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:65:5: note: 'AV_PIX_FMT_BGR24' declared here AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1410:31: error: use of undeclared identifier 'PIX_FMT_GRAY8'; did you mean 'AV_PIX_FMT_GRAY8'? else if (input_pix_fmt == PIX_FMT_GRAY8) { ^~~~~~~~~~~~~ AV_PIX_FMT_GRAY8 /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:70:5: note: 'AV_PIX_FMT_GRAY8' declared here AV_PIX_FMT_GRAY8, ///< Y , 8bpp ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1423:25: error: unknown type name 'PixelFormat'; did you mean 'AVPixelFormat'? (PixelFormat)input_pix_fmt, width, height); ^~~~~~~~~~~ AVPixelFormat /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:60:6: note: 'AVPixelFormat' declared here enum AVPixelFormat { ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1429:47: error: unknown type name 'PixelFormat'; did you mean 'AVPixelFormat'? (PixelFormat)input_pix_fmt, ^~~~~~~~~~~ AVPixelFormat /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:60:6: note: 'AVPixelFormat' declared here enum AVPixelFormat { ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1447:25: error: unknown type name 'PixelFormat'; did you mean 'AVPixelFormat'? (PixelFormat)input_pix_fmt, width, height); ^~~~~~~~~~~ AVPixelFormat /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:60:6: note: 'AVPixelFormat' declared here enum AVPixelFormat { ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1604:25: error: use of undeclared identifier 'PIX_FMT_BGR24'; did you mean 'AV_PIX_FMT_BGR24'? input_pix_fmt = PIX_FMT_BGR24; ^~~~~~~~~~~~~ AV_PIX_FMT_BGR24 /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:65:5: note: 'AV_PIX_FMT_BGR24' declared here AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1607:25: error: use of undeclared identifier 'PIX_FMT_GRAY8'; did you mean 'AV_PIX_FMT_GRAY8'? input_pix_fmt = PIX_FMT_GRAY8; ^~~~~~~~~~~~~ AV_PIX_FMT_GRAY8 /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:70:5: note: 'AV_PIX_FMT_GRAY8' declared here AV_PIX_FMT_GRAY8, ///< Y , 8bpp ^ In file included from /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg.cpp:45: /Users/myuser/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:1683:25: error: use of undeclared identifier 'PIX_FMT_YUV422P'; did you mean 'AV_PIX_FMT_YUV422P'? codec_pix_fmt = PIX_FMT_YUV422P; ^~~~~~~~~~~~~~~ AV_PIX_FMT_YUV422P /usr/local/Cellar/ffmpeg/3.3.4/include/libavutil/pixfmt.h:66:5: note: 'AV_PIX_FMT_YUV422P' declared here AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) ^ fatal error: too many errors emitted, stopping now [-ferror-limit=] 20 errors generated. make[2]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_ffmpeg.cpp.o] Error 1 make[2]: *** Waiting for unfinished jobs.... /Users/myuser/opencv/modules/videoio/src/cap_qtkit.mm:46:9: fatal error: 'QTKit/QTKit.h' file not found #import <QTKit/QTKit.h> ^ 1 error generated. make[2]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_qtkit.mm.o] Error 1 make[1]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2 make: *** [all] Error 2 http://blog.jiashen.me/2014/12/23/build-opencv-3-on-mac-os-x-with-python-3-and-ffmpeg-support/

完整的错误日志:

02

这个关于openCV网站的问题似乎解决了同样的问题,但没有发布解决方案:http://answers.opencv.org/question/90091/error-use-of-undeclared-identifier-avcodec_free_frame-did-you-mean-avcodec_get_name/

2 个答案:

答案 0 :(得分:1)

从错误日志中,当您强制cmake查找版本3.3.4标头和库时,看起来您有ffmpeg版本3.3.3。您应该清除CMake缓存并让它自动检测ffmpeg。或者你可以brew upgrade ffmpeg将你的ffmpeg升级到3.3.4。

另外,我建议使用最新版本的CMake GUI here

答案 1 :(得分:1)

df2$data <- map(df2$data, ~group_by(.x, group_meas) %>% mutate(gr_m_index = row_number()) %>% spread(group_meas, value)) df2 %>% unnest() # (same output as above) avcodec_free_framePixelFormatPIX_FMT_xxx很久以前就已被弃用。我很确定它们甚至不存在于3.3.4或当前的主分支中。

因此,您检出的opencv版本必须太旧才能使用ffmpeg 3.3.4构建,并且可能只与ffmpeg 2系列兼容。

Opencv在最近的提交中更新了ffmpeg兼容性,例如this。您可以看到条件宏适合不同的ffmpeg API,较新的ffmpeg和较旧的av_frame_free