質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

pythonからC++に画像を渡したい。

I_am_
I_am_

総合スコア23

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2回答

1評価

0クリップ

1816閲覧

投稿2021/01/03 11:38

前提・実現したいこと

pythonプログラムでimreadした画像データをC++に渡したいです。

c++で画像処理したデータをBoost::pythonでPythonで使えるようにするのが目標です。
c++単体で動かすときには以下の方法で動作します。

C++単体のスクリプト

#include <iostream> #include <string> #include <vector> #include <opencv2/opencv.hpp> int main(int argc, char* argv[]) { // コマンドライン引数を読む if (argc < 3) { std::cerr << "画像ファイルのパスを指定してください。" << std::endl; return -1; } std::string input_image_path = argv[1]; std::string output_image_path = argv[2]; // 画像を読み込む // アルファチャンネル付きに対応するため IMREAD_UNCHANGED を使う cv::Mat input_image = cv::imread(input_image_path, cv::IMREAD_UNCHANGED); // Haar 特徴ベースのカスケード分類器による物体検出の準備 // 顔検出用のカスケード分類器を使用 std::string face_cascade_name = "/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_alt.xml"; cv::CascadeClassifier face_cascade; if (!face_cascade.load(face_cascade_name)) { std::cerr << "分類器の読み込みに失敗しました。" << std::endl; return -1; }; // 顔を検出 std::vector<cv::Rect> faces; face_cascade.detectMultiScale(input_image, faces); // 出力画像データを入れるオブジェクト // アルファチャンネル付きに対応するため CV_8UC4 を使う // CV_<bit-depth>{U|S|F}C(<number_of_channels>) // CV_8U: ビット深度=符号なし8ビット整数(0〜255) // C4: チャンネル数=4 cv::Mat output_image(input_image.size(), CV_8UC4); // 入力画像データを出力画像データにコピー input_image.copyTo(output_image); for (size_t i=0; i<faces.size(); i++) { // 検出した顔の座標を出力 std::cout << "Face: " << faces[i] << std::endl; // 顔の位置に楕円を描画 cv::Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2); cv::Size size(faces[i].width / 2, faces[i].height / 2); cv::Scalar color(255, 0, 255, 255); // Blue, Green, Red, Alpha double angle = 0; double startAngle = 0; double endAngle = 360; int thickness = 4; cv::ellipse(output_image, center, size, angle, startAngle, endAngle, color, thickness); } // 画像を出力 cv::imwrite(output_image_path, output_image); return 0; }

問題点、わからないところ

基本的にはPython側で処理をしていて重い作業をC++で行う予定です。

Pythonで読み込んだデータをC++でOpencvで画像処理をする場合はどのように受け渡しをするのかが今まで行ったことがないのでわかりません。

Q.pythonでimreadしたデータを上記のように、Matという型の変数で受け取るとるのは間違っていますか?

それとも処理ごとにファイルの書き込みを行って、共有ファイルとして画像を毎回imreadしていくのでしょうか?

基本がわからないのでご教授いただけたら嬉しいです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。