OpenCV-PythonはOpenCVを利用したアルゴリズムを開発するのに、開発しやすい環境です。
そこで開発したアルゴリズムをC++に移植すときのヒントとなるメモを記す。
OpenCV-Pythonの場合:
numpy.array型の利用
→
cv::Mat型への置き換え
numpy.array型固有のメソッドを
cv::Mat型のメソッドへの置き換え。
このような書き換えが、簡単にできます。
画像処理のアルゴリズムを構築できるほどの経験がなくても、C++の経験さえあれば、OpenCV-Pythonのコードを OpenCV C++に書き換えることができます。
numpy.array | cv::Mat | 注意点 |
---|---|---|
a = np.ones((h,w), dtype=np.uint8) | cv::Mat a=cv::Mat::ones(cv::Size(w, h), cv::CV_8U); | |
shape | size | shapeは[h, w, channel]の順番、または[h, w] |
img.shape | cv::Size(img.rows, img.cols) | |
img = cv2.imread("lena.png"); imgRGB=img[:, :, ::-1] | cv::Mat img = cv::imread("lena.png"); | cv2.imread()はBGRの順 |
import pylab as plt; plt.imshow(imgRGB) | cv::imshow("title", img); | matplotlib のimshow()はMatlabのimshow()に近い |
a[:, :] = 0 | a.setTo(0); | カラー画像の場合は a[:, :, :] = 0 。setTo()の引数は定数 |
a[b>127] = 255 | a.setTo(255, b > 127); | |
a = b+0 | b.copyTo(a); | numpyでは単にa = b とするとaはbに対する別名で、実体は同じになる。 |
a[c==d] = b[c==d] | b.copyTo(a, c==d); | |
a = np.array(b, dtype=np.float32)/255.0 | b.convertTo(a, CV_32F, 1.0/255); |
OpenCV-Pythonのコード例
example.py
# -*- coding: utf-8 -*-
import cv2
import numpy as np
img = cv2.imread("lena.png", 0)
b = np.zeros(img.shape[:2], dtype=np.uint8)
b[img > 128] = 255
cv2.imwrite("junk.png", b)
書き換えたC++のソースコードの例
example.cpp
#include <opencv2/opencv.hpp>
int main(int argc, char* argv[]) {
cv::Mat img= cv::imread("lena.png", 0);
cv::Mat b = cv::Mat::zeros(cv::Size(img.rows, img.cols), CV_8U);
b.setTo(255, img>127);
cv::imwrite("junk_cpp.png", b);
}
numpyにある便利な関数
numpy.rot90(m, k=1, axes=(0, 1) (https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.rot90.html)
注意
C++のバージョンが上がるのにともなって、OpenCVで前提とするC++のバージョンも変化しています。この記載内容が古くなっています。