閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

C++

OpenCV(C++)のcv::Matから一部を切り抜いて(ROI)フィルタをかける際に、元画像の画素値も参照される

PythonとC++で、同じような実装をしたつもりが結果が異なるので少しハマりました。 # Python import cv2 import numpy as np mat = np.zeros((100, 100), np.uint8) + 100 cv2.rectangle(mat, (20, 20), (80, 80), 128, cv2.FILLED) roi = mat[20:80, 20:80]…

C++でメモリがコピーされるのかされないのか、意識せずにハマることがある

C++

たとえばOpenCVで以下のようなコードを書くと落ちるのは、分かるんですが、分からないときがある。 cv::Mat GetImage() { std::vector<uint8_t> buf = ...; return cv::Mat(128, 128, CV_8U, buf.data()); } const auto mat = GetImage(); cv::mean(mat); // 死 この</uint8_t>…

C++

うーん、const参照でオブジェクト返しても、shallow copyするやつだと受け取り側が非constで受け取るとオブジェクトの中身書き換えられちゃうか— wata_d (@wata_d) 2022年2月15日 void draw_circle(const cv::Mat& mat) { cv::Mat copy = mat; cv::circle(co…

static変数を返す関数で、変数をlambdaで初期化するイディオム

C++

tensorflowのソースにこんな実装があって、なるほどと思いました。 bool RequireCudnnDeterminism() { static bool require_cudnn_determinism = [] { // TODO(reedwm): Remove the TF_CUDNN_DETERMINISTIC env var. bool cudnn_deterministic = false; TF_C…

has_parent_pathの戻り値

C++

www.little-cuckoo.jp path::has_parent_path - cpprefjp C++日本語リファレンス パスにルートパスのみが含まれていれば、ルートパスの親はルートパスと見なされてtrueが返る ということでした。 c++ - How can a std::filesystem root path have itself as …

ルートディレクトリでhas_parentがfalseになると思っていた

ルートディレクトリでhas_parentがtrueになるの解釈違いだった— wata_d (@wata_d) 2021年10月27日 #include <filesystem> namespace fs = std::filesystem; int main() { fs::path path(R"(C:\Users\Public\Documents)"); while (path.has_parent_path()) { std::cout <<</filesystem>…

OpenCVのMat構造体で任意の列を処理したいとき

C++

メモリ構造を考えるとそれはそう、という話なんですが、こういうコードを書くと実行時間に差が出ます。 cv::TickMeter ticks; ticks.start(); for (int i = 0; i < 1000; ++i) { const auto m = cv::mean(mat.row(i))[0]; } ticks.stop(); std::cout << tick…

OpenCVのMatが強かった

C++

C++版のMat構造体って表現力豊かだなーと思っていましたが、oepratorも色々用意されていて今まで書いてたコードも冗長だったなと気付かされました。 OpenCV: cv::MatExpr Class Reference Matとdoubleを比較してマスクを得る…みたいなことができるので、これ…

OpenCVのSIMD

C++

qiita.com 今度はOpenCVについて復習というか予習しようとネットサーフィンしていました。前一瞬触ったときはバージョン2だったと思いますが、もう4になっているんですね。で、上記のQiita記事もなるほど~と読んでいました。 ただ、ループ版が遅いのはatメ…

配列を任意の値で初期化(fill)したい

0で初期化するなら何の苦労もないのだけど、1とか10にしたいって時。C++ならstd::fillがあるので: int arr[5]; std::fill(arr, arr + _countof(arr), 10); と書ける。さらにstd::vectorには初期値をコンストラクタで指定できるから: std::vector<int> arr(5/*要素</int>…

C++11 チートシート

C++

C++11: A cheat sheet—Alex Sinyakov : Standard C++ 「C++03ではこう書いてたものが、C++11ならこう書けるよ」みたいな。すでに既存のC++をある程度知っている人がC++11に移行するときに便利だと思います。 こんな感じ。 Aという言語を知っている人がBとい…

Boost.Filesystem - ディレクトリ関係の操作

カレントディレクトリの取得とか。 // 初めてこの関数を呼んだときのcurrent_pathの値 path initial_path(); // カレントディレクトリを取得 path current_path(); // カレントディレクトリを変更する void current_path(path const&); // テンポラリディレ…

boost::filesystem::unique_path関数

unique_path関数は実は引数を取るようになっています。 path unique_path(const path& model="%%%%-%%%%-%%%%-%%%%"); path unique_path(const path& model, system::error_code& ec); デフォルト引数があるため引数を渡さなくても利用できますが、引数を渡…

boost::filesystem::pathに対する操作、問い合わせ

Boost.Filesystemには「pathを受け取って何かする」という関数が用意されています。 問い合わせ namespace fs = boost::filesystem; fs::path const dir("C:\\hom"); fs::path const file("hom.txt"); fs::path const path = dir / file; // ファイル or デ…

boost::filesystem::path

Boost.Filesystemにはファイル名やディレクトリ名といったパスを表すためのpathクラスがあります。 パスに対する色々な操作を行うことができます。 初期化 文字列を渡して初期化します。 boost::filesystem::path path("C:\\hom\\hom.txt"); パスの出力 oper…

任意のディレクトリの下にあるファイルを再帰的に見に行く

C++

昨日の、任意のディレクトリの下にあるファイルを再帰的に見に行く処理をC++でもやってみましょう。 Boost.Filesystemのboost::filesystem::recursive_directory_iteratorを使うと、再帰的に見てくれます。 #define BOOST_FILESYSTEM_VERSION 3 #include <boost/filesystem/operations.hpp> in</boost/filesystem/operations.hpp>…

このBoostライブラリは、あのBoostライブラリを利用しています

Boostのライブラリは他のBoostのライブラリを利用して実装されていることが多いです。AsioはThreadを利用していますし、MPLはその他の色々なライブラリの実装の助けになっています。そういった関係を抜き出してみました。ただの暇つぶしで特に意味はありませ…

oven::block

C++

インターフェイスの向き - 偏見プログラマの語り!を読んで、EnumWindows関数をアルゴリズムに渡したいという部分に既視感を覚えたのでぐぐってみたら、この手の関数はovenを使うとおいしく頂けるようになっているようです。元記事の話とは脱線してしまいま…

仕事で使っているBoostライブラリ

C++

前2つのエントリにあるコマンドを組み合わせて、プロジェクト中で使用しているBoostのヘッダファイルを検索してみました(ただの暇つぶしで、意味はありません)。 # こんな感じで抽出 ls -r -include *.cpp,*.hpp,*.h | grep '#include

ディレクトリ内のファイル一覧を取得する(Boost.Filesystem)

C++

find_file_rangeはWindows限定だし今ならBoost.Filesystemを使った方が良さそう、ということで試してみる。 #include <algorithm> #include <iostream> #define BOOST_FILESYSTEM_VERSION 3 #include <boost/filesystem.hpp> int main() { using namespace boost::filesystem; std::copy(directory_itera</boost/filesystem.hpp></iostream></algorithm>…

ディレクトリ内のファイル一覧を取得する(find_file_range)

C++

Windows限定ですが、find_file_rangeを使うと簡単に特定のディレクトリ下にあるファイルの一覧を取得できます。 #include <cstdio> #include <boost/range/algorithm/for_each.hpp> #include <boost/bind.hpp> #include <windows.h> #include "find_file.hpp" int main() { find_file::find_file_range ffrng("*.*"); boost::for_each</windows.h></boost/bind.hpp></boost/range/algorithm/for_each.hpp></cstdio>…

boost::shared_ptrでHMODULEなどを管理する

C++

追記: これが動くのは、そもそも、HMODULEが、ポインター型であることを前提としている。HMODULEがポインターであることを隠すために、わざわざHMODULEという名前を使っているというのに。このコードは、ポータビリティに問題があると言える。 http://cpplov…

Cppcheck(C++ソースの静的解析ツール)

C++

SourceForge.net: cppcheckHudsonのプラグインを漁っているときに見つけた、C++のソースコードを静的に解析してくれるオープンソースのツール。面白そうなので試してみました。 インストール githubにソースが公開されているので、git cloneなりgithub上のア…

boost::result_of<>で __stdcall な関数の戻り値を得られないのでどうにかしてみた

どうやら boost::result_of は __stdcall などの修飾子が付いている関数に対応していないようです。 // これはOK (s_result_type は int) typedef int (* success_t)(); typedef boost::result_of<success_t()>::type s_result_type; s_result_type a = 0; // これはNG (e</success_t()>…

cpplint

Google C++スタイルガイド 日本語訳 | textdrop久しぶりに読んだら、cpplintというツールが紹介されていました。C++ のソースコードが上記のスタイルに則っているかを調べてくれるようです。面白そうなのでちょっと試してみました。 $ cat before.cpp #inclu…

reverse_iterator

C++

STLのコンテナが持っている reverse_iterator 、便利なようで erase や insert ができなくて不便だなと思ったら、 base メンバ関数なんてものがあるんですね。これを使うと iterator が取れるので、 erase やらなんやらが呼べるようになるようです。始めて知…

MFCで作成したウィンドウがリソースをちゃんと解放しているか調べる方法?

C++

一度 DeleteWindow してから再度 Create する。リソースの解放漏れがあると、大体ASSERTで落ちてくれます。便利ですね。……おかげではまった(実行時に落ちまくり)わけですが、まぁ、自業自得ですね(その画面書いたのは自分じゃないんですが)。しかし、問題が…

int* array; みたいなのを Boost.Range で扱いたい。

C++

ラップするしかないのだろうか。 #include <iostream> #include <algorithm> #include <boost/range.hpp> template<class T> class Array { size_t m_size; T* m_ptr; public: Array(T* ptr, size_t n) : m_ptr(ptr), m_size(n) {} typedef T* iterator; typedef T const* const_iterator; iterator begin() </class></boost/range.hpp></algorithm></iostream>…

typename

C++

boost::range_iteraotr<>::typeを使うとコンパイルが通らない。たとえば以下のprint関数。letsboost::range悩んだ末Boost.Rangeのドキュメントを読んだところtypenameが必要らしい。 template<typename Range> void print( Range& r ) { typename boost::range_iterator<Range>::typ</range></typename>…

More C++ Idioms

C++

More C++ Idiomsいつの間にか日本語に訳されていた。ブクマ見ると今年の四月にはあったらしい。知らなかった……。