物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

C/C++

CERN ROOTとPython scipy、lmfit を使って正規分布でフィッティングする方法を比較

同じデータを使って、CERN ROOT、Pythonのscipy、lmfit を使って正規分布でフィッティングするコードと結果を比較する。 まずは、データ生成部分 C++用 std::vector<double> vx{-3.65,-3.45,-3.35,-3.25,-3.15,-3.05,-2.95,-2.85,-2.75,-2.65,-2.55,-2.45,-2.35,-2.2</double>…

Visual Studio: Cで書かれたライブラリをC++から呼ぶ方法

C言語で書かれたライブラリ (.libファイル) を C++からは直接呼ぶことができない。検証してみる。 libtestというプロジェクトで、構成の種類をスタティックライブラリ (.lib)にしたプロジェクトを作成した C言語で書かれたライブラリと、サンプルプログラム…

PyROOTでROOTファイルを読む TFileとRDataFrameの比較

PyROOTでROOTファイルを扱うには、ROOTの作法に従うか、Numpyで頑張るかの2択となる。 ROOTの作法に従った例 ROOTファイルに、イベントごとに色んなパラメータが固定長で格納されているものとする。データ名 ADC の[0]に格納されているデータをヒストグラム…

WSL上のJupyter LabでPython/ROOT C++/PyROOT、Jupyter Notebookでjsrootを動かす

超メモです。$は削除して実行してください WSLでJupyter Labを動かす方法 nodejsは最新版を推奨する。それ以外だとエラーが出ることがある。pip3でsudoは付けない。以下、実行すべきコマンド。 $ sudo sed -i.bak -e 's%http://[^ ]\+%mirror://mirrors.ubun…

C++ OpenCVでalphaチャンネルなし画像からalphaチャンネルを作る

入力画像は、アルファチャンネルあり、なしBGR、グレースケールの3種類に対応した。 アルファチャンネルは8bitの4チャンネルの4つ目で、0-255で与える。0の場合は完全に透過する。 今回は、BGRの輝度値が真っ白付近(245-255)を透過する条件とした。 変換前(…

C++ Eigenを使った正規分布のフィッティング手法

過去に、ROOTとPythonで正規分布のフィッティングをした。 phst.hateblo.jp だが、ROOTはWindowsでx64と共存しないので、x64と共存するライブラリだけを使ったフィッティングを試みた。まずは、 ガウス分布のフィッティング用のサンプルデータ Sample data …

Windows: 自分のパソコンが拡張命令 (AVX-512等)に対応しているか確認する方法

マイクロソフトが提供しているフリーソフトで確認できます。次のプログラム Coreinfo v3.53 をダウンロード、展開して、Coreinfo.exe をコマンドプロンプトで実行しましょう。 docs.microsoft.com 実行例 (一部略)。 * はサポートしている、 -は未サポート。…

ThreadPoolの引数を取得する方法と、処理順序を制御できるcondition_variableの使い方

CPUは複数あるので並列化できるが、出力は並列にする意味がない。また、CPUを使った処理は順不同で良いが、出力は順に行いたい。こういう目的のためには、ThreadPoolと、std::condition_variableを使う。 以下の例では、友人が作ってくれた ThreadPool を使…

OpenCVのPNG形式でエンコードする時の各パラメータの圧縮率と圧縮時間について

OpenCVで画像をPNGファイル、すなわち可逆な形式で圧縮し、ファイルで出力することなくデータを取得したいとき、 cv::imencode というエンコード関数を使う。原理的には以下のように記述する。(そのままでは動かないよ) vector<int> params = vector<int>(2); params[0</int></int>…

PocoとOpenCV: 共有メモリを使ってプロセス間で画像を送受信する

PocoとOpenCVによる画像の共有メモリ経由での書き込み・読み出しの実装例 画像を共有メモリから読み出す OpenCVには、画像の先頭のポインタ sm.begin() を与えると自動的に画像として読んでくれるコンストラクタがあるので、それを利用した。 書き込む方と同…

GoogleTestで例外をGoogleTest側でCatchさせない方法

引数に --gtest_catch_exceptions=0 を追加する stackoverflow.com

C++ OpenCV の cv::encode, cv::decodeを使ってみる

C++ OpenCVの導入、サンプル画像の作り方は Visual Studio 2017 + OpenCV 3.2.0 + x64の初期設定 とOpenCVに関する質問の受け付け(コメント欄へ) - 物理の駅 by onsanai を参照されたし。 cv::encode cv::decode を使うと、ファイル出力なしに出力用のバイト…

Visual Studio 2019 16.6でファイルシステムReFS上のstd::filesystem::removeが正しく動くようになった

Visual Studio 2019 プレビュー版の16.6が3月16日に公開されていたので、先日報告した件が修正されているか試した。 phst.hateblo.jp docs.microsoft.com #include <filesystem> #include <iostream> #include <fstream> #include <stdio.h> int main(int argc, char** argv) { std::error_code ec; s</stdio.h></fstream></iostream></filesystem>…

三項演算子の戻り値に基底クラスと派生クラスを入れた場合の挙動

三項演算子の戻り値に基底クラスと派生クラスを入れた場合、派生クラスの型は基底クラスに変換できないため、 どちらからも共通して変換できる基底クラスが戻ってくる 。 コード協力: H氏 #include <iostream> struct A { int func() const { return 0; } }; struct B </iostream>…

ファイルシステムReFSでstd::filesystem::removeがエラーコード 50 この要求はサポートされていません→16.6で修正予定

Hドライブで、ファイルの保存用にResilient File System (ReFS)を使ってる。 std::filesystem::remove がエラーコード 50で、この要求はサポートされていません。が帰ってきた。 ソースコード #include <filesystem> #include <iostream> int main() { std::error_code ec; std::fi</iostream></filesystem>…

点列で表された道のりを、ある長さごとに区切るアルゴリズム C++

点列を表すのにOpenCVの cv::Point2f を使ったが、OpenCVライブラリは使ってないので適宜置き換えて欲しい。 最後から1つめと、最後の点との距離はlengthではない。 std::vector<cv::Point2f> cell_length(const std::vector<cv::Point2f>& points, double length) { assert(points.siz</cv::point2f></cv::point2f>…

CCDカメラで撮像した画像をOpenCVを使って縞々模様を除去する

CCDカメラは読み出し方式による縞々模様(1行ごとに輝度の濃淡が発生する)現象が起こる。 通常、ハードウェア側で調整されるものだが、ソフトウェア側で調整する必要に迫られたので、そのコードを公開する。 なお、Visual Studio + C# + OpenCVSharp と C++を…

C++でコンストラクターを別のコンストラクターから呼ぶ方法 (C++11以上)

Can I call a constructor from another constructor (do constructor chaining) in C++? stackoverflow.com class Foo { public: Foo(char x, int y) {} Foo(int y) : Foo('a', y) {} };

boost 1.65.0 と C++17 でエラー

1>x:\boost_1_65_0\boost\operators.hpp(839): error C4996: 'std::iterator<std::output_iterator_tag,void,void,void,void>': warning STL4015: The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17. (The <iterator> header is NOT deprecated.) The C++ Standard</iterator></std::output_iterator_tag,void,void,void,void>…

C++のstd::asyncでメンバー関数を使ったマルチスレッド処理

#include <future> #include <mutex> #include <iostream> std::mutex mtx3; class MyClass3 { int long_calc1(int j) { std::this_thread::sleep_for(std::chrono::milliseconds(1000)); mtx3.lock(); std::cout << "1 a" << std::endl; mtx3.unlock(); std::this_thread::sleep_for(</iostream></mutex></future>…

C++でstd::asyncを使ったマルチスレッド処理

#include <future> #include <thread> #include <vector> #include <iostream> #include <mutex> // 標準出力のmutex std::mutex mtx_; int long_calc(int i) { std::this_thread::sleep_for(std::chrono::milliseconds(1000)); mtx_.lock(); std::cout << "a" << i << std::endl; mtx_.unlock(); std:</mutex></iostream></vector></thread></future>…

C++でSleep

#include <thread> std::this_thread::sleep_for(std::chrono::milliseconds(1));</thread>

Visual Studio C++ x64のstd::ofstream のwriteには2GBの壁はない

The limitation of the size for the std::ofstream write is not 2GB in Visual Studio 2017. The limitation would be 64bit limits. std::vector<uchar> v(0x100000000); // 4GB (=2^32) std::ofstream ofs("o", std::ios::binary); ofs.write((char*)&v[0], v.s</uchar>…

C++のクラスをPythonから使うためにBoost::Pythonを使うまで

BoostのPython用ライブラリを使いたかったのでコンパイルする 参考文献。 Boostライブラリのビルド方法 - boostjp Boost 最新版をソースコードからビルドし、インストール(MSVC ビルドツールを使用)(Windows 上) Visual Studio 2019の x64 Native Tools …

yaml-cppをWindows10 Visual Studio 2019でコンパイルする

git clone https://github.com/jbeder/yaml-cpp cmake for Windowsで、 Where is the source code に ***/yaml-cpp Where to build the binaries に ***/yaml-cpp/build Configure から Visual Studio 2019 x64 を選ぶ Xドライブにインストールしたい。Debug…

OpenCVを使った画像内のピーク検出プログラム

ピークの周波数によって、途中のBoxFilterとGaussianBlurのカーネルサイズは変えると良い。 背景の強度を求めて、有意度を求めるのがこのプログラムのミソである。 var size = new OpenCvSharp.Size(nbin, nbin); Mat signal = Mat.Zeros(size, MatType.CV_3…

螺旋を描くためのC++ソースコード

uint64_t range = 1000; int x = 0; int y = 0; uint64_t loop = 0; uint64_t shift = 0; for (uint64_t i = 1; i < range * range; i++) { std::cout<<x<<" "<<y<<" "<<i<<std::endl; if (i == (loop * 2 + 1) * (loop * 2 + 1)) { loop++; shift = 0; x++; } else { shift++; if (shift >= loop * 6) { x++; } else if (s…</x<<">

std::filesystemを使ってディレクトリ(フォルダ)内にある全ファイルをリストしたりディレクトリを作成したり

VS2017 VS2019の環境では、 /std:c++latest または /std:c++17 をコンパイルオプションに追加する必要がある。 具体的な作業は、プロジェクトのオプション→C/C++→言語→C++言語標準 で /std:c++latest または /std:c++17 を追加する。/std:c++latest は実験的…

exeのfull pathとDLLのfull pathを得る方法

tbb.dll (例)のフルパスを得る方法と、実行中のexeそのもののフルパスを得る方法 char path[2048]; GetModuleFileNameA(GetModuleHandleA("tbb.dll"), path, 2048); cout << path; GetModuleFileNameA(NULL, path, 2048); cout << path; pathに日本語名が入…

OpenCV 2系でGPUで膨張処理をさせる方法

OpenCV 2系でGPUで膨張処理をさせる方法で詰まったので書いておく。最後に検証に使った全コードがあるのでどうぞ。 CPUで膨張処理をさせるとき、さくっと書けば次のようになる。 cv::Mat src, dst; int width = 256; int height = 256; src = cv::Mat::eye(c…