博主QQ:1356438802
QQ群:473383394——UVC&OpenCV47
本文实验平台:ubuntu12.04虚拟机 + opencv 2.4.10 + QT Creator 2.4.1 + QT 4.8.1(64bits)
经过前面两篇文章的实验,我们已经能够在ubuntu下成功使用opencv 简单的程序预览usb camera的图像,接下来我要把《win7_64bits下QT使用openCV库(3)》文章中的例程移植到Ubuntu平台中使用,实现预览、拍照、录像功能。
关于Ubuntu下的QT环境搭建,请自行查找资料,基本上"sudo apt-get install qtcreator",就能安装完成,不过这样自动安装的qtlib版本一般较低,像我现在就是qt 4.8.1。如果需要更高版本的lib,还要另外安装!
好,开始工作!
把testOpenCV_preview2工程拷贝到"Z:\QT_workspace"目录下,删除工程下的testOpenCV_preview2.pro.user文件,然后用qtcreator打开工程。接下来我们需要修改.pro文件,让工程能够找到Ubuntu的opencv相关文件。
common.pri
#lib库其他目录
OPENCV_DIR = /usr/local
OPENCV_INCDIR = $$OPENCV_DIR/include
OPENCV_BINDIR = $$OPENCV_DIR/bin
OPENCV_LIBDIR = $$OPENCV_DIR/lib
testOpenCV_preview2.pro
#-------------------------------------------------
#
# Project created by QtCreator 2016-07-07T14:39:53
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = testOpenCV_preview
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
message("start include opencv INCLUDE and LIBS")
include (common.pri)
unix {
message("linux include opencv INCLUDE and LIBS")
INCLUDEPATH+= $$OPENCV_INCDIR/opencv \
$$OPENCV_INCDIR/opencv2
LIBS+= $$OPENCV_LIBDIR/libopencv_calib3d.so \
$$OPENCV_LIBDIR/libopencv_contrib.so \
$$OPENCV_LIBDIR/libopencv_core.so \
$$OPENCV_LIBDIR/libopencv_features2d.so \
$$OPENCV_LIBDIR/libopencv_flann.so \
$$OPENCV_LIBDIR/libopencv_gpu.so \
$$OPENCV_LIBDIR/libopencv_highgui.so \
$$OPENCV_LIBDIR/libopencv_imgproc.so \
$$OPENCV_LIBDIR/libopencv_legacy.so \
$$OPENCV_LIBDIR/libopencv_ml.so \
$$OPENCV_LIBDIR/libopencv_nonfree.so \
$$OPENCV_LIBDIR/libopencv_objdetect.so \
$$OPENCV_LIBDIR/libopencv_ocl.so \
$$OPENCV_LIBDIR/libopencv_photo.so \
$$OPENCV_LIBDIR/libopencv_stitching.so \
$$OPENCV_LIBDIR/libopencv_superres.so \
$$OPENCV_LIBDIR/libopencv_video.so \
$$OPENCV_LIBDIR/libopencv_videostab.so
}
RESOURCES += \
img.qrc
源码不需要做任何修改,因为opencv本身就是跨平台的开源库,Unix / Linux / MacOS / Android / Windows都可以使用。
完了"run qmake",生成makefile,然后"build project",编译成功,马上运行,看看效果如何:
软件启动
打开摄像头
跟前一篇文章main.cpp的效果一样,但是跟windows下testOpenCV_preview2的效果相比差远了!而且录制的视频也是同样锯齿化的色块。两个平台下frame的大小都是640x480,最终画面却不同!
具体原因暂不追究。
思考点:
1. usb camera 640x480分辨率在三个平台的预览效果
2. 运行testOpenCV_preview2这个工程时,如果第二次"Open Camera",会出现Camera初始化失败,没有找到一种有效的视频格式,这个问题和《我的Opencv4Android添加V4L2支持的移植记录(2)》文章中描述的第三个问题是同一个问题!
因为windows和linux(Android和Ubuntu都是Linux类系统)对usb camera的支持框架是不同的,windows下DirectShow表现正常,而Android和Ubuntu下V4L2现在表现出同样的问题,这个必须查清楚!
usb camera 在三个平台的第二次Open的情况
3. QT + OpenCV(或者其他开源库),这种搭配框架对于有很强跨平台需求的项目是非常非常好的选择!
4. 将testOpenCV_preview2工程在windows和Ubuntu,两个平台的.pro文件相结合,我们就知道一个真正跨平台的工程,应该怎么构建,.pro文件应该怎么书写了!
5. 在目录下打开makefile文件看看
其中
INCPATH = -I/usr/share/qt4/mkspecs/linux-g++ -I../testOpenCV_preview -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I/usr/local/include/opencv -I/usr/local/include/opencv2 -I. -I. -I../testOpenCV_preview -I.
LIBS = $(SUBLIBS) -L/usr/lib/x86_64-linux-gnu /usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_contrib.so /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_features2d.so /usr/local/lib/libopencv_flann.so /usr/local/lib/libopencv_gpu.so /usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_imgproc.so /usr/local/lib/libopencv_legacy.so /usr/local/lib/libopencv_ml.so /usr/local/lib/libopencv_nonfree.so /usr/local/lib/libopencv_objdetect.so /usr/local/lib/libopencv_ocl.so /usr/local/lib/libopencv_photo.so /usr/local/lib/libopencv_stitching.so /usr/local/lib/libopencv_superres.so /usr/local/lib/libopencv_video.so /usr/local/lib/libopencv_videostab.so -lQtGui -lQtCore -lpthread
和我们前面讲的是一致的,只要把头文件和lib指定出来,就可以基本编译通过!
makefile内容
#############################################################################
# Makefile for building: testOpenCV_preview
# Generated by qmake (2.01a) (Qt 4.8.1) on: Mon Jul 4 20:06:24 2016
# Project: ../testOpenCV_preview/testOpenCV_preview2.pro
# Template: app
# Command: /usr/bin/qmake-qt4 -spec /usr/share/qt4/mkspecs/linux-g++ CONFIG+=debug CONFIG+=declarative_debug -o Makefile ../testOpenCV_preview/testOpenCV_preview2.pro
#############################################################################
####### Compiler, tools and options
CC = gcc
CXX = g++
DEFINES = -DQT_WEBKIT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED
CFLAGS = -pipe -g -Wall -W -D_REENTRANT $(DEFINES)
CXXFLAGS = -pipe -g -Wall -W -D_REENTRANT $(DEFINES)
INCPATH = -I/usr/share/qt4/mkspecs/linux-g++ -I../testOpenCV_preview -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I/usr/local/include/opencv -I/usr/local/include/opencv2 -I. -I. -I../testOpenCV_preview -I.
LINK = g++
LFLAGS =
LIBS = $(SUBLIBS) -L/usr/lib/x86_64-linux-gnu /usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_contrib.so /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_features2d.so /usr/local/lib/libopencv_flann.so /usr/local/lib/libopencv_gpu.so /usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_imgproc.so /usr/local/lib/libopencv_legacy.so /usr/local/lib/libopencv_ml.so /usr/local/lib/libopencv_nonfree.so /usr/local/lib/libopencv_objdetect.so /usr/local/lib/libopencv_ocl.so /usr/local/lib/libopencv_photo.so /usr/local/lib/libopencv_stitching.so /usr/local/lib/libopencv_superres.so /usr/local/lib/libopencv_video.so /usr/local/lib/libopencv_videostab.so -lQtGui -lQtCore -lpthread
AR = ar cqs
RANLIB =
QMAKE = /usr/bin/qmake-qt4
TAR = tar -cf
COMPRESS = gzip -9f
COPY = cp -f
SED = sed
COPY_FILE = $(COPY)
COPY_DIR = $(COPY) -r
STRIP = strip
INSTALL_FILE = install -m 644 -p
INSTALL_DIR = $(COPY_DIR)
INSTALL_PROGRAM = install -m 755 -p
DEL_FILE = rm -f
SYMLINK = ln -f -s
DEL_DIR = rmdir
MOVE = mv -f
CHK_DIR_EXISTS= test -d
MKDIR = mkdir -p
####### Output directory
OBJECTS_DIR = ./
####### Files
SOURCES = ../testOpenCV_preview/main.cpp \
../testOpenCV_preview/mainwindow.cpp moc_mainwindow.cpp \
qrc_img.cpp
OBJECTS = main.o \
mainwindow.o \
moc_mainwindow.o \
qrc_img.o
DIST = /usr/share/qt4/mkspecs/common/unix.conf \
/usr/share/qt4/mkspecs/common/linux.conf \
/usr/share/qt4/mkspecs/common/gcc-base.conf \
/usr/share/qt4/mkspecs/common/gcc-base-unix.conf \
/usr/share/qt4/mkspecs/common/g++-base.conf \
/usr/share/qt4/mkspecs/common/g++-unix.conf \
/usr/share/qt4/mkspecs/qconfig.pri \
/usr/share/qt4/mkspecs/modules/qt_webkit_version.pri \
/usr/share/qt4/mkspecs/features/qt_functions.prf \
/usr/share/qt4/mkspecs/features/qt_config.prf \
/usr/share/qt4/mkspecs/features/exclusive_builds.prf \
/usr/share/qt4/mkspecs/features/default_pre.prf \
../testOpenCV_preview/common.pri \
/usr/share/qt4/mkspecs/features/debug.prf \
/usr/share/qt4/mkspecs/features/default_post.prf \
/usr/share/qt4/mkspecs/features/declarative_debug.prf \
/usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
/usr/share/qt4/mkspecs/features/warn_on.prf \
/usr/share/qt4/mkspecs/features/qt.prf \
/usr/share/qt4/mkspecs/features/unix/thread.prf \
/usr/share/qt4/mkspecs/features/moc.prf \
/usr/share/qt4/mkspecs/features/resources.prf \
/usr/share/qt4/mkspecs/features/uic.prf \
/usr/share/qt4/mkspecs/features/yacc.prf \
/usr/share/qt4/mkspecs/features/lex.prf \
/usr/share/qt4/mkspecs/features/include_source_dir.prf \
../testOpenCV_preview/testOpenCV_preview2.pro
QMAKE_TARGET = testOpenCV_preview
DESTDIR =
TARGET = testOpenCV_preview
first: all
####### Implicit rules
.SUFFIXES: .o .c .cpp .cc .cxx .C
.cpp.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
.cc.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
.cxx.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
.C.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
.c.o:
$(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
####### Build rules
all: Makefile $(TARGET)
$(TARGET): ui_mainwindow.h $(OBJECTS)
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
{ test -n "$(DESTDIR)" && DESTDIR="$(DESTDIR)" || DESTDIR=.; } && test $$(gdb --version | sed -e 's,[^0-9]\+\([0-9]\)\.\([0-9]\).*,\1\2,;q') -gt 72 && gdb --nx --batch --quiet -ex 'set confirm off' -ex "save gdb-index $$DESTDIR" -ex quit '$(TARGET)' && test -f $(TARGET).gdb-index && objcopy --add-section '.gdb_index=$(TARGET).gdb-index' --set-section-flags '.gdb_index=readonly' '$(TARGET)' '$(TARGET)' && rm -f $(TARGET).gdb-index || true
Makefile: ../testOpenCV_preview/testOpenCV_preview2.pro /usr/share/qt4/mkspecs/linux-g++/qmake.conf /usr/share/qt4/mkspecs/common/unix.conf \
/usr/share/qt4/mkspecs/common/linux.conf \
/usr/share/qt4/mkspecs/common/gcc-base.conf \
/usr/share/qt4/mkspecs/common/gcc-base-unix.conf \
/usr/share/qt4/mkspecs/common/g++-base.conf \
/usr/share/qt4/mkspecs/common/g++-unix.conf \
/usr/share/qt4/mkspecs/qconfig.pri \
/usr/share/qt4/mkspecs/modules/qt_webkit_version.pri \
/usr/share/qt4/mkspecs/features/qt_functions.prf \
/usr/share/qt4/mkspecs/features/qt_config.prf \
/usr/share/qt4/mkspecs/features/exclusive_builds.prf \
/usr/share/qt4/mkspecs/features/default_pre.prf \
../testOpenCV_preview/common.pri \
/usr/share/qt4/mkspecs/features/debug.prf \
/usr/share/qt4/mkspecs/features/default_post.prf \
/usr/share/qt4/mkspecs/features/declarative_debug.prf \
/usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
/usr/share/qt4/mkspecs/features/warn_on.prf \
/usr/share/qt4/mkspecs/features/qt.prf \
/usr/share/qt4/mkspecs/features/unix/thread.prf \
/usr/share/qt4/mkspecs/features/moc.prf \
/usr/share/qt4/mkspecs/features/resources.prf \
/usr/share/qt4/mkspecs/features/uic.prf \
/usr/share/qt4/mkspecs/features/yacc.prf \
/usr/share/qt4/mkspecs/features/lex.prf \
/usr/share/qt4/mkspecs/features/include_source_dir.prf \
/usr/lib/x86_64-linux-gnu/libQtGui.prl \
/usr/lib/x86_64-linux-gnu/libQtCore.prl
$(QMAKE) -spec /usr/share/qt4/mkspecs/linux-g++ CONFIG+=debug CONFIG+=declarative_debug -o Makefile ../testOpenCV_preview/testOpenCV_preview2.pro
/usr/share/qt4/mkspecs/common/unix.conf:
/usr/share/qt4/mkspecs/common/linux.conf:
/usr/share/qt4/mkspecs/common/gcc-base.conf:
/usr/share/qt4/mkspecs/common/gcc-base-unix.conf:
/usr/share/qt4/mkspecs/common/g++-base.conf:
/usr/share/qt4/mkspecs/common/g++-unix.conf:
/usr/share/qt4/mkspecs/qconfig.pri:
/usr/share/qt4/mkspecs/modules/qt_webkit_version.pri:
/usr/share/qt4/mkspecs/features/qt_functions.prf:
/usr/share/qt4/mkspecs/features/qt_config.prf:
/usr/share/qt4/mkspecs/features/exclusive_builds.prf:
/usr/share/qt4/mkspecs/features/default_pre.prf:
../testOpenCV_preview/common.pri:
/usr/share/qt4/mkspecs/features/debug.prf:
/usr/share/qt4/mkspecs/features/default_post.prf:
/usr/share/qt4/mkspecs/features/declarative_debug.prf:
/usr/share/qt4/mkspecs/features/unix/gdb_dwarf_index.prf:
/usr/share/qt4/mkspecs/features/warn_on.prf:
/usr/share/qt4/mkspecs/features/qt.prf:
/usr/share/qt4/mkspecs/features/unix/thread.prf:
/usr/share/qt4/mkspecs/features/moc.prf:
/usr/share/qt4/mkspecs/features/resources.prf:
/usr/share/qt4/mkspecs/features/uic.prf:
/usr/share/qt4/mkspecs/features/yacc.prf:
/usr/share/qt4/mkspecs/features/lex.prf:
/usr/share/qt4/mkspecs/features/include_source_dir.prf:
/usr/lib/x86_64-linux-gnu/libQtGui.prl:
/usr/lib/x86_64-linux-gnu/libQtCore.prl:
qmake: FORCE
@$(QMAKE) -spec /usr/share/qt4/mkspecs/linux-g++ CONFIG+=debug CONFIG+=declarative_debug -o Makefile ../testOpenCV_preview/testOpenCV_preview2.pro
dist:
@$(CHK_DIR_EXISTS) .tmp/testOpenCV_preview1.0.0 || $(MKDIR) .tmp/testOpenCV_preview1.0.0
$(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/testOpenCV_preview1.0.0/ && $(COPY_FILE) --parents ../testOpenCV_preview/mainwindow.h .tmp/testOpenCV_preview1.0.0/ && $(COPY_FILE) --parents ../testOpenCV_preview/img.qrc .tmp/testOpenCV_preview1.0.0/ && $(COPY_FILE) --parents ../testOpenCV_preview/main.cpp ../testOpenCV_preview/mainwindow.cpp .tmp/testOpenCV_preview1.0.0/ && $(COPY_FILE) --parents ../testOpenCV_preview/mainwindow.ui .tmp/testOpenCV_preview1.0.0/ && (cd `dirname .tmp/testOpenCV_preview1.0.0` && $(TAR) testOpenCV_preview1.0.0.tar testOpenCV_preview1.0.0 && $(COMPRESS) testOpenCV_preview1.0.0.tar) && $(MOVE) `dirname .tmp/testOpenCV_preview1.0.0`/testOpenCV_preview1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/testOpenCV_preview1.0.0
clean:compiler_clean
-$(DEL_FILE) $(OBJECTS)
-$(DEL_FILE) *~ core *.core
####### Sub-libraries
distclean: clean
-$(DEL_FILE) $(TARGET)
-$(DEL_FILE) Makefile
check: first
mocclean: compiler_moc_header_clean compiler_moc_source_clean
mocables: compiler_moc_header_make_all compiler_moc_source_make_all
compiler_moc_header_make_all: moc_mainwindow.cpp
compiler_moc_header_clean:
-$(DEL_FILE) moc_mainwindow.cpp
moc_mainwindow.cpp: ../testOpenCV_preview/mainwindow.h
/usr/bin/moc-qt4 $(DEFINES) $(INCPATH) ../testOpenCV_preview/mainwindow.h -o moc_mainwindow.cpp
compiler_rcc_make_all: qrc_img.cpp
compiler_rcc_clean:
-$(DEL_FILE) qrc_img.cpp
qrc_img.cpp: ../testOpenCV_preview/img.qrc \
../testOpenCV_preview/pic/desktop.jpg
/usr/bin/rcc -name img ../testOpenCV_preview/img.qrc -o qrc_img.cpp
compiler_image_collection_make_all: qmake_image_collection.cpp
compiler_image_collection_clean:
-$(DEL_FILE) qmake_image_collection.cpp
compiler_moc_source_make_all:
compiler_moc_source_clean:
compiler_uic_make_all: ui_mainwindow.h
compiler_uic_clean:
-$(DEL_FILE) ui_mainwindow.h
ui_mainwindow.h: ../testOpenCV_preview/mainwindow.ui
/usr/bin/uic-qt4 ../testOpenCV_preview/mainwindow.ui -o ui_mainwindow.h
compiler_yacc_decl_make_all:
compiler_yacc_decl_clean:
compiler_yacc_impl_make_all:
compiler_yacc_impl_clean:
compiler_lex_make_all:
compiler_lex_clean:
compiler_clean: compiler_moc_header_clean compiler_rcc_clean compiler_uic_clean
####### Compile
main.o: ../testOpenCV_preview/main.cpp ../testOpenCV_preview/mainwindow.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o ../testOpenCV_preview/main.cpp
mainwindow.o: ../testOpenCV_preview/mainwindow.cpp ui_mainwindow.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o mainwindow.o ../testOpenCV_preview/mainwindow.cpp
moc_mainwindow.o: moc_mainwindow.cpp
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_mainwindow.o moc_mainwindow.cpp
qrc_img.o: qrc_img.cpp
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o qrc_img.o qrc_img.cpp
####### Install
install: FORCE
uninstall: FORCE
FORCE: