diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..1d085cac --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +** diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..adfac13d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,60 @@ +FROM ubuntu:16.04 AS opencv +LABEL maintainer="Hybridgroup" + +RUN apt-get update && apt-get install -y --no-install-recommends \ + git build-essential cmake pkg-config unzip libgtk2.0-dev \ + curl ca-certificates libcurl4-openssl-dev libssl-dev \ + libavcodec-dev libavformat-dev libswscale-dev libtbb2 libtbb-dev \ + libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev && \ + rm -rf /var/lib/apt/lists/* + +ARG OPENCV_VERSION="4.0.0" +ENV OPENCV_VERSION $OPENCV_VERSION + +RUN curl -Lo opencv.zip https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && \ + unzip -q opencv.zip && \ + curl -Lo opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/${OPENCV_VERSION}.zip && \ + unzip -q opencv_contrib.zip && \ + rm opencv.zip opencv_contrib.zip && \ + cd opencv-${OPENCV_VERSION} && \ + mkdir build && cd build && \ + cmake -D CMAKE_BUILD_TYPE=RELEASE \ + -D CMAKE_INSTALL_PREFIX=/usr/local \ + -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-${OPENCV_VERSION}/modules \ + -D WITH_JASPER=OFF \ + -D BUILD_DOCS=OFF \ + -D BUILD_EXAMPLES=OFF \ + -D BUILD_TESTS=OFF \ + -D BUILD_PERF_TESTS=OFF \ + -D BUILD_opencv_java=NO \ + -D BUILD_opencv_python=NO \ + -D BUILD_opencv_python2=NO \ + -D BUILD_opencv_python3=NO \ + -D OPENCV_GENERATE_PKGCONFIG=ON .. && \ + make -j $(nproc --all) && \ + make preinstall && make install && ldconfig && \ + cd / && rm -rf opencv* + +################# +# Go + OpenCV # +################# +FROM opencv AS gocv +LABEL maintainer="Hybridgroup" + +ARG GOVERSION="1.11.2" +ENV GOVERSION $GOVERSION + +RUN apt-get update && apt-get install -y --no-install-recommends \ + git software-properties-common && \ + curl -Lo go${GOVERSION}.linux-amd64.tar.gz https://dl.google.com/go/go${GOVERSION}.linux-amd64.tar.gz && \ + tar -C /usr/local -xzf go${GOVERSION}.linux-amd64.tar.gz && \ + rm go${GOVERSION}.linux-amd64.tar.gz && \ + rm -rf /var/lib/apt/lists/* + +ENV GOPATH /go +ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH + +RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH" +WORKDIR $GOPATH + +RUN go get -u -d gocv.io/x/gocv && go run ${GOPATH}/src/gocv.io/x/gocv/cmd/version/main.go diff --git a/Makefile b/Makefile index f3c96523..d0642f98 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,12 @@ .ONESHELL: -.PHONY: test deps download build clean astyle cmds +.PHONY: test deps download build clean astyle cmds docker # OpenCV version to use. OPENCV_VERSION?=4.0.0 +# Go version to use when building Docker image +GOVERSION?=1.11.2 + # Temporary directory to put files into. TMP_DIR?=/tmp/ @@ -56,7 +59,7 @@ build: cd $(TMP_DIR)opencv/opencv-$(OPENCV_VERSION) mkdir build cd build - cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=$(TMP_DIR)opencv/opencv_contrib-$(OPENCV_VERSION)/modules -D BUILD_DOCS=OFF BUILD_EXAMPLES=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_opencv_java=OFF -D BUILD_opencv_python=OFF -D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=OFF WITH_JASPER=OFF -DOPENCV_GENERATE_PKGCONFIG=ON .. + cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=$(TMP_DIR)opencv/opencv_contrib-$(OPENCV_VERSION)/modules -D BUILD_DOCS=OFF -D BUILD_EXAMPLES=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_opencv_java=NO -D BUILD_opencv_python=NO -D BUILD_opencv_python2=NO -D BUILD_opencv_python3=NO -D WITH_JASPER=OFF -DOPENCV_GENERATE_PKGCONFIG=ON .. $(MAKE) -j $(shell nproc --all) $(MAKE) preinstall cd - @@ -66,7 +69,7 @@ build_raspi: cd $(TMP_DIR)opencv/opencv-$(OPENCV_VERSION) mkdir build cd build - cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=$(TMP_DIR)opencv/opencv_contrib-$(OPENCV_VERSION)/modules -D BUILD_DOCS=OFF BUILD_EXAMPLES=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_opencv_java=OFF -D BUILD_opencv_python=OFF -D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=OFF -D ENABLE_NEON=ON -D ENABLE_VFPV3=ON WITH_JASPER=OFF -DOPENCV_GENERATE_PKGCONFIG=ON .. + cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=$(TMP_DIR)opencv/opencv_contrib-$(OPENCV_VERSION)/modules -D BUILD_DOCS=OFF -D BUILD_EXAMPLES=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_opencv_java=OFF -D BUILD_opencv_python=NO -D BUILD_opencv_python2=NO -D BUILD_opencv_python3=NO -D ENABLE_NEON=ON -D ENABLE_VFPV3=ON -D WITH_JASPER=OFF -D OPENCV_GENERATE_PKGCONFIG=ON .. $(MAKE) -j $(shell nproc --all) $(MAKE) preinstall cd - @@ -98,6 +101,8 @@ verify: test: go test . ./contrib +docker: + docker build --build-arg OPENCV_VERSION=$(OPENCV_VERSION) --build-arg GOVERSION=$(GOVERSION) . astyle: astyle --project=.astylerc --recursive *.cpp,*.h diff --git a/README.md b/README.md index e1098c2b..120910e7 100644 --- a/README.md +++ b/README.md @@ -223,6 +223,56 @@ Please note that you will need to run these 2 lines of code one time in your cur go run -tags customenv ./cmd/version/main.go +### Docker + +The project now provides `Dockerfile` which lets you build [GoCV](https://gocv.io/) Docker image which you can then use to build and run `GoCV` applications in Docker containers. The `Makefile` contains `docker` target which lets you build Docker image with a single command: + +``` +make docker +``` + +By default Docker image built by running the command above ships [Go](https://golang.org/) version `1.11.2`, but if you would like to build an image which uses different version of `Go` you can override the default value when running the target command: + +``` +make docker GOVERSION='1.11.1' +``` + +#### Running GUI programs in Docker on macOS + +Sometimes your `GoCV` programs create graphical interfaces like windows eg. when you use `gocv.Window` type when you display an image or video stream. Running the programs which create graphical interfaces in Docker container on macOS is unfortunately a bit elaborate, but not impossible. First you need to satisfy the following prerequisites: +* install [xquartz](https://www.xquartz.org/). You can also install xquartz using [homebrew](https://brew.sh/) by running `brew install cask xquartz` +* install [socat](https://linux.die.net/man/1/socat) `brew install socat` + +Note, you will have to log out and log back in to your machine once you have installed `xquartz`. This is so the X window system is reloaded. + +Once you have installed all the prerequisites you need to allow connections from network clients to `xquartz`. Here is how you do that. First run the following command to open `xquart` so you can configure it: + +```shell +open -a xquartz +``` +Click on *Security* tab in preferences and check the "Allow connections" box: + +![app image](./images/xquartz.png) + +Next, you need to create a TCP proxy using `socat` which will stream [X Window](https://en.wikipedia.org/wiki/X_Window_System) data into `xquart`. Before you start the proxy you need to make sure that there is no process listening in port `6000`. The following command should **not** return any results: + +```shell +lsof -i TCP:6000 +``` +Now you can start a local proxy which will proxy the X Window traffic into xquartz which acts a your local X server: + +```shell +socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\" +``` + +You are now finally ready to run your `GoCV` GUI programs in Docker containers. In order to make everything work you must set `DISPLAY` environment variables as shown in a sample command below: + +```shell +docker run -it --rm -e DISPLAY=docker.for.mac.host.internal:0 your-gocv-app +``` + +**Note, since Docker for MacOS does not provide any video device support, you won't be able run GoCV apps which require camera.** + ### Alpine 3.7 Docker image There is a Docker image with Alpine 3.7 that has been created by project contributor [@denismakogon](https://github.com/denismakogon). You can find it located at [https://github.com/denismakogon/gocv-alpine](https://github.com/denismakogon/gocv-alpine). @@ -266,7 +316,7 @@ This new Homebrew recipe will install only OpenCV 4.0.0 without all of the Pytho ### pkgconfig Installation pkg-config is used to determine the correct flags for compiling and linking OpenCV. You can install it by using Homebrew: - + brew install pkgconfig ### Verifying the installation @@ -402,7 +452,7 @@ You can get the profile's count at any time using: gocv.MatProfile.Count() ``` -You can display the current entries (the stack traces) with: +You can display the current entries (the stack traces) with: ```go var b bytes.Buffer diff --git a/images/xquartz.png b/images/xquartz.png new file mode 100644 index 00000000..a49b251f Binary files /dev/null and b/images/xquartz.png differ