Google testのインストール、使用方法(Ubuntu 20.04)

参考

[ubuntu]Google Testの導入方法 - Qiita

業務効率化の道具箱(5)Google Testを使ってみよう【その1】:山浦恒央の“くみこみ”な話(158)(3/3 ページ) - MONOist

main関数をテストしたい基地外な人のためのメモ - ひでたそ覚書帳

インストール

$ sudo apt-get install libgtest-dev

検査対象

//テスト対象の関数
int sum(int a, int b){
    return a+b;
}
int sub(int a, int b){
    return a-b;
}

検査コード

カバレッジを見たいので、sum()のみ検査。

#include <main.c>
#include  <gtest/gtest.h>

//テストコード
TEST(TestCase, sum) {
    EXPECT_EQ(2, sum(1,1));        //OK
    EXPECT_EQ(1000, sum(123,877)); //OK
    EXPECT_EQ(-8, sum(-12,3));     //NG
}

ビルド

$ g++ test.c -lgtest_main -lgtest -lpthread -I. -o test

以下でテスト実行。

$ ./test
  • 注意点

gccでビルドすると、以下のようなエラーが出る。そのため、g++でビルドすること。

In file included from test.c:2:
/usr/include/gtest/gtest.h:55:10: fatal error: cstddef: No such file or directory
   55 | #include <cstddef>
      |          ^~~~~~~~~
compilation terminated.

ビルド(カバレッジも計測)

以下のように、-fprofile-arcs -ftest-coverageを付けて実行。

$ g++ test.c  -fprofile-arcs  -ftest-coverage -lgtest_main -lgtest -lpthread -I. -o test

$ ./test実行後、以下を実行すると、カバレッジが出る。期待値の50%が得られている。

$ gcov -b test.gcda 
...
File 'main.c'
Lines executed:50.00% of 4
Creating 'main.c.gcov'

後片付け

$ rm *.gcov *.gcda *.gcno

main()関数もテストする

検査対象

//テスト対象の関数
int sum(int a, int b){
    return a+b;
}

int sub(int a, int b){
    return a-b;
}

int main(){
    return sum(1, 2);
}

検査コード

// エントリーポイントをリネーム
#define main _old_main

// テストしたいコードを取り込み
#include "main.c"

// エントリーポイントを test_main に変更
#undef main
#define test_main main
#include  <gtest/gtest.h>

//テストコード
TEST(TestCase, sum) {
    EXPECT_EQ(2, sum(1,1));        //OK
    EXPECT_EQ(1000, sum(123,877)); //OK
    EXPECT_EQ(-8, sum(-12,3));     //NG
    EXPECT_EQ(3, _old_main());     //OK
}

// テストのエントリーポイント
int test_main(int argc, char* argv[])
{
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

ネットワークスペシャリスト キーワード、解答例メモ

初めに

ネスペに向けて、キーワード、解答例をまとめた。

参考

【ネスペ直前対策】ネットワークスペシャリスト過去問 要点まとめ【午後】

ネットワークスペシャリスト過去問道場|ネットワークスペシャリスト.com



イーサネット

ルーティング

  • ルーティングプロトコル

    • OSPF: リンクステート方式、マルチキャスト・LSAを広告、コストの少ない経路を選択、代表ルータ・バックアップ代表ルータ、エリアを分割する・境界では経路集約する、境界にあるものはAS境界ルータ、0番のバックボーンエリアが必要
    • RIP: 距離ベクトル方式、マルチキャスト、ホップ数の少ない経路を選択、障害判断まで時間がかかる(180Sec)
    • BGP: パスベクトル方式、TCPユニキャスト・BGPピア、KeepAliveパケットを交換して死活監視、LOCAL_PREF>AS_PATH
  • ルーティングループが発生しないためには、経路情報を再び同じASに配布しない

  • ルーティングの「再配布」とは、異なるルーティングプロトコル間で経路情報を交換すること。

TCP/IP

  • IPv6: アドレス長は128ビットグローバルアドレス・ユニークローカルアドレス・リンクローカルアドレスなどがある、ブロードキャストアドレスはなく、マルチキャストを使う、近隣探索、オプションは拡張ヘッダを追加、ヘッダ長は固定(IPv4は可変)

  • ウェルノウンポート:80(HTTP)、443(HTTPS)、25(SMTP)、53(DNS)、67・68(DHCP

TCP

  • スロースタートアルゴリズム、重複ACKを3回連続で検出ストウィンドウサイズを減らす
  • RTT: ラウンドトリップ時間、RTTが長い場合、連続でデータ送信して時々ACKを送信すると効率的、その時受信失敗しタ場合、ACKを送って再送させる
  • TCP: フラグメント、SYN/ACK

  • ARP: ブロードキャストで送信

  • ARPテーブル:IPアドレスとMACアドレスのペア、ルータやPCが持つ、キャッシュされる
  • GARP: 自身のMACアドレスを通知、VRRPなどでスイッチにMACアドレスを学習させるために使ったりもする

  • ICMP: エコー要求/応答、到達不能、リダイレクト

  • DHCP: DHCPリレーエージェント、DHCPスヌーピング

セキュリティ

  • GRE:トンネリング、マルチキャストパケットも可、GREでユニキャストにカプセル化してIPSecで暗号化
  • L2TP:トンネリング、PPP、トランスポートモードを使う
  • IPSec:トランスポート・トンネルモード、SA、IKE、リキー、Diffie-Hellman、メイン・アグレッシブモード、事前共有鍵、AH・ESP
  • SSL/TLS:サーバ認証、クライアント認証、メッセージ認証、暗号化、ハンドシェーク、Client Hello、Server Hello、CAルート証明書
  • SSL VPN:リバースプロキシ方式、ポートフォワーディング方式、L2フォワーディング方式
  • 無線LAN:WEP・RC4、WPA2、エンタープライズモード、EPAで暗号化方式決める、パーソナルモード・事前共有鍵

冗長化

  • リンク・スイッチ:リンクアグリゲーション、スタック接続、スパニングツリー、パスコスト、ルートブリッジ、ルートポート、代表ポート、ブロッキングポート、ブリッジプライオリティ・MACアドレス、リンク状態が変わったら更新
  • ルータ:VRRP、仮想ルータ・仮想IPアドレス・仮想MACアドレス、VRID、255個まで、VRRP広告で死活監視
  • サーバ:負荷分散装置、ヘルスチェック、ラウンドロビン、最小コネクション数、Sorryサーバ、セッション維持、CookieTLSアクセラレーション機能、ハートビートパケット
  • 回線:マルチホーミング
  • NICチーミング、リンクアグリケーション、リンクステートトラッキング・上位で障害発生すると、下位をリンクダウン

DNS

  • 名前解決:Hosts、再帰問い合わせ、スタブリゾルバ、反復問い合わせ、フルサービスリゾルバ、キャッシュサーバ、コンテンツサーバ
  • ゾーン情報:名前、TTL、レコード、NS・権威DNSサーバ、A、AAAA、CNAME・外部に公開するホスト名に対応するサーバ名、MX・メールサーバ、ゾーン転送・TCP53番

過去問の解答例

過去問の記述問題の解答例を集めてみた。読んでみて、粒度や言い回しの感覚をつかむ。

  • OSPFへのデフォルトルートを導入する
  • ルーティングテーブルサイズを小さくする
  • フレーム中のタグ情報内の優先ビットを使用するから
  • ポート故障時の代替ポートを事前に決定しているから
  • 転送遅延がなく,ポートの状態遷移を行う
  • ループがない構成だから
  • 静的 NAT の変換後の IP アドレスを,新公開 Web サーバから現 行の公開 Web サーバの IP アドレスに変更する。
  • PC が収容されているサブネットを識別し,対応する DHCP のスコープから IP アドレスを割り当てるため
  • ルータ 10 とルータ 11 は OSPF を構成するインタフェースが二つあり,迂回路 を構成できるから
  • 経路のループを回避するため
  • BGP テーブルから最適経路を一つだけ選択し,ルータのルーティングテーブル に反映する。
  • BGP の経路情報よりも静的経路設定の経路情報の方が優先されるから
  • 輻輳時にエコー応答を受信することがあり検知できない。
  • ルータ 10Z とルータ 11Z の障害時に誤って検知する。
  • 単位時間当たりの通信ログデータ量が突発的に増えたり減ったりし たこと
  • リンクダウンを伴わない故障発生時に,LAG のメンバから故障回線を自動で除 外できる。
  • 1G ビット/秒を超えたパケットが廃棄される。
  • 通信の送信元と宛先 MAC アドレスの組合せが少なくハッシュ関数の計算値が 分散しないから
  • T 社が IP-w1 を変更しても,A 社 DNS サーバの変更作業が不要となる。
  • HTTP ヘッダを編集する処理
  • 任意の IP アドレスから Web システムへの HTTPS 通信を許可す る。
  • XFF ヘッダに送信元 IP アドレスを追加する設定
  • IP アドレスを固定設定すれば,正常 PC 以外でも通信できる。
  • 対処用セグメントへのルーティング情報を追加する。
  • 対処用セグメントのアドレスプールを追加する。
  • HTTPS 以外のポートの CONNECT を拒否する。
  • ネクストホップが SD-WAN ルータとなるデフォルトルート
  • 社内 PC から G 社 SaaS へのアクセスがプロキシサーバを経由しなくな るから
  • 出張先の PC から G 社 SaaS へのアクセスが記録されるから
  • スパニングツリーが再構築中だったから
  • 5 分ごとに状態を取得するので多くの場合異常検知が遅れる。
  • 到達確認がないのでメッセージが失われる可能性がある。
  • スパニングツリーが再構築するまでインフォームの再送信を繰り返す。
  • 利用者ごとのトラフィックを区別するため
  • OSPF のマルチキャスト通信を通すため
  • BGP4 から得られた経路を優先する。
  • 新拠点追加のときに全拠点の設定変更が必要になるから
  • OSPF のプライオリティを 0 に設定する。
  • X 社が運用・保守を行う機器から X 社 FW の方向に確立される TCP コネクシ ョンだけを許可する。
  • クライアント証明書を配布してクライアント認証を行う。
  • TCP の送信処理中に,デバイスの電源断などで TCP コネクションが開放され た場合
  • Web AP の URI を固定にし,絶対 URI を事前に通知してもらう。
  • 送信元 IP アドレスを NAT ルータ-P に,宛先 IP アドレスをエッジサーバ-P に,それぞれ変換する。
  • 1:1 静的双方向 NAT の設定を NAT ルータに追加する。
  • 通信を許可するルールを通信装置内の FW に追加する。
  • 顧客ごとに異なるフィルタリングの設定が必要であるから
  • 顧客ごとにルーティングの設定が必要であるから
  • 物理サーバへの接続ポートに,全ての顧客の仮想サーバに設定された VLAN ID を設定する。
  • FWp の内部側ポートと LBp の仮想 IP アドレスをもつポートは,同一セグメン トであり,物理サーバ 3 内で処理されるから

確定申告のやり方(ふるさと納税、証券、貸株金利)

はじめに

この記事を書いている人間は、税理士でも何でもない普通のサラリーマンです。なので、内容に誤りがある可能性があります。このページはあくまで参考としてください。

また、マイナンバーカードを持っていることが前提です。

対象

確定申告を行う対象は次の通り。

手順

  1. 以下のサイトの「確定申告書等の作成はこちら」をクリックする。

    個人でご利用の方 | 【e-Tax】国税電子申告・納税システム(イータックス)

  2. 以下の「作成開始」をクリックする。

  3. マイナンバーカードをお持ちの方」の「スマートフォンを使用してe-Tax」をクリック

  4. 「令和4年度分の申告書等の作成」から「所得税」をクリック

  5. 「マイナポータルと連携する」をクリックし、画面に従ってログインする。

  6. 「収入金額・所得金額の入力」の画面まで進んだら、以下の入力を行っていく。

    1. 「給与」の入力を行う。「給与所得」をクリックし、「書面で交付された年末調整済みの源泉徴収票の入力」から給与取得を入力する。図解してくれてるので、特に問題なくわかるはず。

    2. 「配当」の入力を行う。「配当所得」をクリックし、配当所得を入力する。「総合課税」と「申告分離課税」は納税者が選択することができる。大きく違うのは、固定の税率か、累進課税かという点。

      【確定申告書等作成コーナー】-課税方法(総合課税と申告分離課税)

      平成21年1月1日以後に支払を受けるべき上場株式等の配当等(平成28年1月1日以後は特定上場株式等の配当等に係る配当所得)については、総合課税のほかに、申告分離課税を選択することができます。

    3. 「貸株金利」の入力を行う。「雑所得」>>「その他」をクリックし入力する。

      • 種目:「その他」>>「貸株金利
      • 所得の生ずる場所又は法人番号:{証券会社の法人番号}
      • 報酬などの支払者の氏名・名称:{証券会社名}

      例えば楽天証券なら以下。

      楽天証券株式会社 | 5010701021660 | gBizINFO

    4. 「株の譲渡益」の入力を行う。「株式等の譲渡所得等」をクリックする。証券会社から「特別口座年間取引報告書」等の書類を入手して入力を行う。例えば楽天証券なら、PCサイトの「マイメニュー」>>「確定申告サポート」>>「特定口座」>>「取引書面」から「特別口座年間取引報告書」を入手できる。

  7. 次の「所得控除の入力」へ進む。※社会保険料控除は給与のところで入力済。

    1. ふるさと納税」の入力を行う。「寄附金控除」を選択し、入力を行う。特に問題なくわかるはず。
  8. 「次へ」で進めていき、納付方法などを入力し、完了させる。

FX自動売買のやり方(楽天証券・無料EA)

MT4というシステムトレード用ソフトを使用した、FX自動売買の方法について説明する。本記事では楽天証券の口座で無料EAを使用して取引を行うことを想定している。

自動売買とは?

自動売買とはその字の通り、FXの売買をシステムが自動で行うことである。自動売買を実現させるには、MT4やMT5というソフトを使用することが一般的である。(証券会社が独自にツールを出しているものもある。)MT4では証券会社の口座にログイン後、EA(エキスパートアドバイザ)というものを稼働させ、このEAが自動売買を行う。EAは独自に開発することもできるが、ネット上で配布しているものもある。ネット上で配布されているEAを使えば、特に苦労もなく自動売買を実現できる。

本記事では無料のEAをインストールし、パラメータ調整を行い、自動売買を稼働させるところまでを説明する。

無料EAについて

EAの中には、無料で配布しているが特定の証券会社の口座でしか使用できないものがある。これは、無料で使用させてあげる代わりに、開発者はスプレッドで報酬を受け取っているためであり、報酬を受け取れる証券会社のみでしか使用できない。今回は楽天証券で稼働させることを目的とするため、そのようなEAは使用せず、完全に無料のものを使用する。

口座の開設

まずはFXの口座開設を行う。まずはデモトレードだけという場合も、デモ口座の開設が必要。

www.rakuten-sec.co.jp

MT4のインストール

次にMT4をインストールする。見つけづらいが以下のページからダウンロードできる。

www.rakuten-sec.co.jp

MT4の起動・口座のログイン・チャートの表示

MT4を起動し、口座へログインし、好きな通貨ペアのチャートを表示する。ここのやり方はいろんなサイトで紹介されているので省略。

無料EAのインストール

無料EAを公開しているところはいくつかあるが、今回は最もメジャーなMQL5からEAをダウンロードする。MQL5の無料EAのページは以下。

www.mql5.com

今回は以下の「Dark Venus」というEAを使用する。左の「ダウンロード」というボタンを押すと、MT4が起動し、Dark venusがインストールされる。

www.mql5.com

Dark Venusとは?

Dark Venusとは以下のようなEAである。

  • インディケータ:ボリンジャー バンドに基づく
    • 通貨ペア:EURUSD, GBPUSD, AUDUSD and USDCAD
    • 期間:M5, M15
  • 戦略:マーチンゲール

インディケータとは相場を判断し、売買を行うか判断するための基準である。これが正しいほど勝率が上がり、リスクも下がる。大抵は通貨ペアや期間に最適化されているため、指定されている通貨ペアで使用すべきではある。(Dark venusはほかの通貨ペアでも行けんじゃない?と書いてある) 戦略とはどのように売買を行うかである。FXは相場を読むことは難しく、誤ったポジションをとることは珍しくない。そこで重要となるのが、どう売買をすれば利益が出るかである。マーチンゲールは予測と逆方向に動いた場合に、倍の値段でナンピン買いをし、損益分岐点を今のレートに近づける方法である。通貨レートは大きな相場でない限り、ある程度の幅で振動する、という考えがあるため、マーチンゲールは有効な手段である。ただし倍々で買っていくためリスクも上がるため、適切な設定をしていないとすぐに破綻する可能性がある。

対応している通貨ペア、スプレッドを考慮して、以下の設定で行う。期間は短いほうが取引回数が増えるため、リスクが下がる。

  • 通貨ペア:EURUSD
  • 期間:M5

EAの設定

  1. EURUSDのチャートを表示する。
  2. EURUSDのチャートを選択した状態で、ナビゲータウィンドウのDark venusを右クリックし、チャートに表示を押す。これで以下のようなチャートが表示されればOK。

www.youtube.com

EAのパラメータ設定

このまま自動売買を起動すると、際限なくナンピン買いしすぐに破綻するので、リスク回避のための設定を行う。チャートを右クリックし、エキスパートアドバイザ→設定で設定ウィンドウを開く。項目は以下。

  • Lots:取引開始のロット数。0.01か0.02にしておく。
  • MaxBuyOrders、MaxSellOrders:買い・売りのナンピン買いをする最大回数。4くらいが安全。
  • Monetary Stop Loss:どれだけ損失が発生したら、取引を止めるか。これは個人の裁量によるが、あまりにも低いと損切りを繰り返して儲けが出ないので、ある程度大きくする。(Enable Monetary Stop Loss、Stop EA after Monetary LossがTrueの場合のみ有効)
  • Enable Monetary Stop Loss:指定しただけ損失が発生した場合、ポジションをクローズする。(EAは止めない)Trueにする。
  • Stop EA after Monetary Loss:指定しただけ損失が発生した場合、EAを停止する。Trueにする。

上記を設定しておけば、ナンピン買いの回数が限定されるため、大きな相場があってもすぐに退場にならず、最大の損失を設定しておくことで、万が一損失が大きくなっても、EAは自動で止まってくれる。

注意点としては、MaxBuyOrders、MaxSellOrders、Monetary Stop Lossをあまりにもリスクを取らない数値にすると、儲けが出ないので、バックテストで適切な数値を決めること。 また、設定に誤りがないよう、フォワードテストを行うこと。(ちゃんと停止してくれるかは、Monetary Stop Lossを1にしてテストすればいい)

自動売買の起動

上の「自動売買」と書いてあるボタンを押して自動売買を起動する。1時間たっても取引が行われない場合は、何かおかしいので期間等見直ししたほうがいい。

WindowsでOpenCV C++を使用する方法(Visual studio)

Windows Visual studio 2019からOpenCV4.6.0 C++のアプリケーションをビルドして動かす方法です。

やり方を載せているところは無数にあるので、最も簡単に動かすところまで行きたいと思います。

手順

  1. OpenCVのインストール

    以下のページから"opencv-4.6.0-vc14_vc15.exe"というEXEファイルをダウンロードします。

    Releases · opencv/opencv · GitHub

  2. "opencv-4.6.0-vc14_vc15.exe"を実行します。この時インストールするディレクトリ(以下、${opencv_dir})はどこでもOKです。

  3. 環境変数に以下を設定します

    • 名前:PATH
    • 値:${opencv_dir}\build\x64\vc14\bin
  4. Visual Studioを起動して、空のコンソールアプリケーションを作成します。

  5. ソースコードに以下を記載します。cv::imreadの引数は、自分の持っている画像を指定します。

    #include<opencv2/opencv.hpp>
    
    int main(int argc, char* argv[])
    {
     cv::Mat img = cv::imread("C:/work/tmp.jpg");
     cv::imshow("", img);
     cv::waitKey(0);
     cv::destroyAllWindows();
    
     return 0;
    }
    
  6. プラットフォームをX64にします。

  7. プロジェクト->プロパティ から以下を設定します。

  8. C/C++ -> 追加のインクルードディレクトリ:${opencv_dir}\build\include

  9. リンカー -> 全般 -> 追加のライブラリディレクトリ:${opencv_dir}\build\x64\vc14\lib
  10. リンカー -> 入力 -> 追加の依存ファイル:opencv_world460d.lib

※追加の依存ファイルは、デバッグビルドの時はopencv_world460d.lib、リリースビルドの時はopencv_world460.libを使う。

再生ボタン押して、デバッグを開始すると、指定した画像が表示される。

Unityで自己位置推定(OBR SLAM3)やってみた

UnityでOBR SLAM3を動かしてみた。環境はWindows上でUnityを動かし、WSL上でOBR SLAM3を動かしている。

動作としては以下のような感じ。動いてはいるものの、マップ生成は全くうまくいっていない。

youtu.be

前準備

以下に通信用のコード(Linon_SDK)が置いてあるのでダウンロードしておく。

GitHub - wooolwooolwoool/Linon_SDK

OBR SLAM3側

以下のページを参考に、WSLにOBR SLAM3をインストールする。

WSLでORB SLAM3を動かす(完成版) - ぼうびろく

build.sh実行前に、Linon_SDKに以下のコードが入っているので差し替えておく。

  • mono_inertial_euroc.cc

Unity側

今回は町として以下のパッケージを使うのでインポートしておく。特に制限はないので、使いたい街を使ってもOK。

assetstore.unity.com

  1. File -> Open Sceneから以下のファイルを開く。

    • Assets/CityVoxelPack/DemoScenes/Demo.unity
  2. CubeObjectを作成して、CubeMove.csをアタッチする。

  3. CubeObjectにカメラを追加し、カメラにcamera_udp.csをアタッチし、ip_addをWSLのIPアドレス(172.21..となっているもの)に変更する。(アップデートでlocalhostでも通信できるようになったらしいので不要かも。)

  4. オブジェクトの向き、位置、方向を調整する。

実行

  1. Unity側で再生を押す。
  2. OBR SLAM3側で以下のコマンドを実行する。

    $ ./Examples/Monocular-Inertial/mono_inertial_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/EuRoC.yaml ../Datasets/EuRoc/MH01 ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt dataset-MH01_mono
    
  3. ウィンドウが表示された後、Unity側でCubeを動かすとFrameとMapが表示される。

UnityのカメラからC++やPythonへ映像を転送する方法

Unityのカメラから他プロセスへ映像を転送する方法として、以下のような一般的なプロセス間通信が考えられる。

  • MMAP
  • ソケット通信
  • RTSP

この記事ではこれらの方法を解説する。ただしRTSPはGStreamerのインストール方法ができなかったのでやっていない。

MMAP

MMAPはメモリ上にファイル等をマッピングし、表面上はファイルのやり取りではあるが、実際にはメモリ上でやり取りを行うプロセス間通信である。例えば書き込み側がIMGというファイルに画像を書き込み、読み込み側がIMGというファイルを読み込むことで、画像を読み込むことができる。これをMMAPを使用するとメモリ上でやり取りができ、高速な通信が可能となる。

送信側

コードは以下の通り。mmfというMemoryMappedFileにPNGエンコードした画像を書き込んでいる。MemoryMappedFileを作成する際のtag名は後ほど使う。

        accessor = mmf.CreateViewAccessor();
        RenderTexture.active = cam.targetTexture;

        tex.ReadPixels(new Rect(0, 0, tex.width, tex.height), 0, 0);
        tex.Apply();

        byte[] bytes = tex.EncodeToPNG();
        accessor.WriteArray<byte>(0, bytes, 0, bytes.Length);
        accessor.Dispose();

スクリプト全文は以下。実際に使用する際は、そのままスクリプトを使用すればOK。

Linon_SDK/camera_mmap.cs at main · wooolwooolwoool/Linon_SDK · GitHub

受信側

受信側のPythonコードは以下の通り。tagnameは送信側と合わせる。

class MMAPCamera():
    def __init__(self, tagname):        
        self.mm = mmap.mmap(-1, 1024 * 1024 * 50, tagname)
        
    def read(self):
        self.mm.seek(0)     
        mode = self.mm.read()
        ByteToImg = Image.open(io.BytesIO(mode))
        return ByteToImg

コード全文は以下。

Linon_SDK/camera.py at main · wooolwooolwoool/Linon_SDK · GitHub

ソケット通信

ソケット通信ではデータをUDPTCPで送信する。MMAPと違いネットワークを使用するため低速にはなってしまうものの、対向がネットワーク上にあればよいので別PC間での通信も可能となる。

送信側

送信側は以下の通り。先ほどデータを書き込んでいたのを、UDPで送信しているという違いだけである。あとソケット通信は低速なので、JPGエンコードにしてQualityを調整できるようにしてある。

        byte[] bytes = tex.EncodeToJPG(quality);
        udpClientSend.Send(bytes, bytes.Length);

スクリプト全体は以下の通り。

Linon_SDK/camere_udp.cs at main · wooolwooolwoool/Linon_SDK · GitHub

受信側

受信側のC++コードは以下の通り。受信データをOpenCVでデコードすればOK。

udp0.udp_recv(data, buf_size);
std::vector<uchar> buf(data, data+buf_size);
im = cv::imdecode(cv::Mat(buf), -1);

コード全体は以下の通り。ORB SLAM3に適当に組み込んだもの。

Linon_SDK/mono_inertial_euroc.cc at main · wooolwooolwoool/Linon_SDK · GitHub