未分類

User
以下のプログラムを実行すると、以下のようなエラーがでてきます。 [ERROR:0@0.100] global cap.cpp:643 open VIDEOIO(CV_IMAGES): raised OpenCV exception: OpenCV(4.9.0) /io/opencv/modules/videoio/src/cap_images.cpp:430: error: (-215:Assertion failed) !filename_pattern.empty() in function 'open' Traceback (most recent call last): File "/home/cam/virtual_camera/vc.py", line 32, in <module> main() File "/home/cam/virtual_camera/vc.py", line 24, in main cv2.imshow('Frame', frame) cv2.error: OpenCV(4.9.0) /io/opencv/modules/highgui/src/window.cpp:1272: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage' 対処方法を教えてください。 import cv2 def main(): # mp4ファイルのパスを指定 video_path = "192.168.1.1.mp4" # mp4ファイルを開く video_capture = cv2.VideoCapture(video_path) # カメラの解像度を設定 width = 640 height = 480 video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, width) video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, height) # RTSPカメラのフリをするための準備 rtsp_url = "rtsp://localhost:38089/live" # RTSPサーバーのアドレス fourcc = cv2.VideoWriter_fourcc(*'H264') # ビデオコーデックを指定 rtsp_camera = cv2.VideoWriter(rtsp_url, fourcc, 30, (width, height)) # 30fpsで設定 # mp4ファイルを繰り返し再生してRTSPカメラのフリをする while True: ret, frame = video_capture.read() # フレームを読み込む if not ret: video_capture.set(cv2.CAP_PROP_POS_FRAMES, 0) # ファイルの終端に到達した場合、最初に戻る continue rtsp_camera.write(frame) # フレームをRTSPカメラに書き込む # フレームを表示(テスト用) cv2.imshow('Frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break # 後処理 video_capture.release() rtsp_camera.release() cv2.destroyAllWindows() if __name__ == "__main__": main()
ChatGPT

このエラーメッセージは、2つの主要な問題を示しています。

  1. ファイルが開けない問題:
    • このエラーは、OpenCVが指定されたビデオファイル(この場合は192.168.1.1.mp4)を開けないことを示しています。これは、ファイルパスが間違っているか、ファイルが存在しない、あるいはアクセス権限がない場合に発生する可能性があります。
    • 解決策としては、まずファイルパスが正しいかどうかを確認してください。また、ファイルが存在し、アクセス権限があることを確認してください。
  2. cv2.imshow関連の問題:
    • このエラーは、OpenCVがコンパイルされた時に必要なGUIウィンドウサポートが含まれていないことを示しています。これは通常、LinuxシステムでGUI関連のライブラリが不足しているか、あるいは適切にリンクされていない場合に発生します。
    • UbuntuやDebian系のLinuxディストリビューションを使用している場合、libgtk2.0-devpkg-configをインストールしてから、OpenCVを再コンパイルすることで解決できます。以下のコマンドを実行してください:
      sh
    • sudo apt-get update
      sudo apt-get install libgtk2.0-dev pkg-config

      その後、OpenCVをソースから再コンパイルする必要があります。これには、OpenCVのソースコードをダウンロードし、cmakeを使ってビルド設定を行い、makeコマンドでビルドを実行するプロセスが含まれます。このプロセスは時間がかかる場合がありますが、GUI機能を使うためには必要です。

      OpenCVの再コンパイルが必要かどうかを判断する前に、video_pathが正しいかを再確認し、必要に応じて修正してください。また、ビデオファイルが正しく読み込まれているかどうかを確認する別の方法として、ファイルの読み込みに成功したかどうかをチェックするためにret変数の値をログに出力することもお勧めします。

User
video_pathが正しいかを再確認の方法を教えてください
ChatGPT

video_pathが正しいかどうかを確認するには、いくつかの手順を踏むことができます。まず、指定されたパスが実際に存在するファイルを指しているかを確認する必要があります。これはPythonのos.pathモジュールを使用して簡単に行えます。以下のステップでvideo_pathの確認を行う方法を示します。

  1. ファイルの存在確認:
    • Pythonのos.path.exists関数を使用して、ファイルが存在するかどうかを確認します。
    • また、os.path.isfile関数を使用して、指定されたパスが実際にファイルであることを確認することもできます。
  2. パスの正確さ:
    • 絶対パスまたは相対パスが正しく指定されているかを確認します。絶対パスはファイルシステムのルートから完全なパスを示し、相対パスは現在の作業ディレクトリからの位置を示します。

以下のコードスニペットは、上記の検証を行う方法を示しています。

python
import os

video_path = "192.168.1.1.mp4" # ここでのパスは例としています。実際のパスに置き換えてください。

# ファイルが存在するかどうかを確認
if os.path.exists(video_path) and os.path.isfile(video_path):
print("ファイルが存在し、正しいパスです。")
else:
print("ファイルが存在しないか、パスが間違っています。")

このスクリプトを実行することで、指定されたvideo_pathが正しいかどうかを確認できます。ファイルが存在しない場合やパスが間違っている場合は、パスを修正してください。ファイルがネットワーク上にある場合(例えば、IPアドレスを含むパスを使用している場合)、そのファイルにアクセスできるかどうかを確認するためには、適切なネットワークパスまたはストリーミングURLが使用されていることを確認する必要があります。

User
ファイルが存在し、正しいパスです。 と表示されました。
ChatGPT

ファイルが存在し、正しいパスであることが確認できた場合、問題の原因は他にあります。エラーメッセージから、2つの主な問題が考えられます:

  1. OpenCVのGUI関連の機能が動作していない
    • cv2.imshowでエラーが発生していることから、OpenCVがGUIライブラリ(GTK、Qtなど)と正しく連携していない可能性があります。これは、OpenCVのインストール時にGUIサポートが含まれていない、またはGUIライブラリ自体がインストールされていないことが原因である可能性があります。
  2. ビデオキャプチャデバイスの問題ではない
    • ファイルパスが正しく、ファイルも存在するため、ビデオキャプチャデバイス(この場合はファイル)に関する問題ではありません。

解決策

既に確認したGUI関連の問題に対する解決策を再度試す価値があります。具体的には、OpenCVがGUIライブラリと正しく連携するようにするために必要な依存関係をインストールし、OpenCVを再コンパイルすることです。以下は、そのためのステップです:

  1. 必要なGUIライブラリのインストール: UbuntuやDebian系のシステムでは、以下のコマンドを実行します:
    bash
  1. sudo apt-get update
    sudo apt-get install libgtk2.0-dev pkg-config

    これにより、GUI開発に必要なライブラリがインストールされます。

  2. OpenCVの再コンパイル: OpenCVをソースから再コンパイルすることで、これらのライブラリを使用するように設定できます。これには、OpenCVのソースコードをダウンロードし、CMakeを使用してビルド設定を行い、その後ビルド(コンパイル)を実行するプロセスが含まれます。
  3. 別の表示方法の検討cv2.imshowが使用できない場合は、画像処理の結果を確認するための別の方法を検討することもできます。例えば、処理したフレームを画像ファイルとして保存してから、別の画像ビューアで開く方法があります。

GUIライブラリが適切にセットアップされていないことが原因である場合、上記のステップで問題が解決するはずです。それでも問題が解決しない場合は、OpenCVのインストール方法(pip経由、ソースからのビルドなど)や、使用しているシステムの詳細(OSのバージョンなど)に関する情報を再確認し、それに基づいて対処を検討してください。

User
OpenCVの再コンパイル方法を教えてください
ChatGPT

OpenCVをソースから再コンパイルするには、いくつかのステップを踏む必要があります。以下は、Linuxベースのシステム(特にUbuntuやDebian系)でOpenCVを再コンパイルするための一般的な手順です。このプロセスは、OpenCVを最新バージョンでビルドし、GUIサポートを含めることを目的としています。

事前準備

  1. 必要な依存関係をインストールします。OpenCVとそのGUI機能を使用するためには、いくつかのパッケージが必要です。
    bash
  1. sudo apt-get update
    sudo apt-get install build-essential cmake pkg-config
    sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng-dev
    sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
    sudo apt-get install libxvidcore-dev libx264-dev
    sudo apt-get install libgtk-3-dev
    sudo apt-get install libatlas-base-dev gfortran
    sudo apt-get install python3-dev

OpenCVのソースコードのダウンロード

  1. OpenCVとOpenCV_contrib(追加機能を含む)のソースコードをダウンロードします。
    bash
  1. cd ~
    git clone https://github.com/opencv/opencv.git
    git clone https://github.com/opencv/opencv_contrib.git

    特定のバージョンをビルドしたい場合は、各リポジトリ内でgit checkout <バージョンタグ>を実行してください。

ビルド設定

  1. ビルドディレクトリを作成し、CMakeを使用してビルド設定を行います。
    bash
  1. cd ~/opencv
    mkdir build
    cd build
    cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_C_EXAMPLES=ON \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_GENERATE_PKGCONFIG=ON \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
    -D BUILD_EXAMPLES=ON ..

    このコマンドは、OpenCVをビルドするための様々なオプションを設定します。必要に応じてオプションを調整してください。

コンパイル

  1. コンパイルを実行します。このプロセスには時間がかかる場合があります。
    bash
  1. make -j$(nproc)

    -j$(nproc)オプションは、利用可能なすべてのCPUコアを使用してビルドを加速します。

インストール

  1. コンパイルが完了したら、システムにインストールします。
    bash
  1. sudo make install
    sudo ldconfig

確認

  1. OpenCVが正しくインストールされたかを確認します。
    bash
pkg-config --modversion opencv4

またはPythonから:

python
  1. import cv2
    print(cv2.__version__)

これらのステップを完了すると、OpenCVがシステムにインストールされ、GUI関連の機能も使用できるようになります。エラーが発生した場合は、エラーメッセージを注意深く読み、不足している依存関係がないかどうかを確認してください。

未分類

もう寝たいんだが、システムが寝かせてくれない。

止めるわけにもいかないし(そういう中断で、これまでいくつのシステムを壊してきたことやら)

つくづく思うのですが、パッケージは、そのインポートの前に「予想完了時刻」を示すべきだ、と思うのです

未分類

このプログラムでは、緯度・経度の位置情報から距離の計算を行わずに補完を行っていますが、これは私の意図したものではありません。

下記のsmall_bus_data.csvのデータを使って、私が作って欲しいプログラムのアルゴリズムを説明します。

現在1番目のデータには、12:55:00の時刻情報が入っており、30番目のデータには、13:00:00の時刻情報が入っています。
つまり、この間には、300秒の時間が経過していることになります。

次に、1番目の緯度経度と2番目の緯度経度から距離(メートル)が算出できます。
次に、2番目の緯度経度と3番目の緯度経度から距離(メートル)が算出できます。
最後に、29番目の緯度経度と30番目の緯度経度から距離(メートル)が算出できます。
これらを合計すると、合計移動距離(メートル)が算出できます。
この合計移動距離を、前述の300秒で割ると、平均の秒速が算出できます。
この秒速を使って、現在、時間情報が入っていない、2、3、4、.... 29番目の時刻が算出できますので、それを表示して下さい。

同じように、
現在30番目のデータには、13:00:00の時刻情報が入っており、39番目のデータには、13:02:00の時刻情報が入っています。
つまり、この間には、120秒の時間が経過していることになります。

次に、30番目の緯度経度と31番目の緯度経度から距離(メートル)が算出できます。
次に、31番目の緯度経度と32番目の緯度経度から距離(メートル)が算出できます。
最後に、38番目の緯度経度と39番目の緯度経度から距離(メートル)が算出できます。
これらを合計すると、合計移動距離(メートル)が算出できます。
この合計移動距離を、前述の300秒で割ると、平均の秒速が算出できます。
この秒速を使って、現在、時間情報が入っていない、30、31、.... 38番目の時刻が算出できますので、それを表示して下さい。

以下のsmall_bus_data.csvの時間情報は以下の通りです。

====== small_bus_data.csv ここから =========

1, 93, 139.62957005198, 35.36604342344, 12:55:00
2, 94, 139.62977593991, 35.36605145489,
3, 95, 139.62975577321, 35.36614821472,
(中略)
28, 180, 139.6225614208, 35.36578048832,
29, 178, 139.62231637196, 35.36565733887,
30, 179, 139.62231637196, 35.36565733887, 13:00:00
31, 178, 139.62231637196, 35.36565733887,
(中略)
38, 122, 139.62212431581, 35.36739269906,
39, 123, 139.62186543167, 35.36793117811, 13:02:00

====== small_bus_data.csv ここまで =========

まあ、それでも、私が着手開始できる程度のコードの叩き台は作ってくれましたので、まずまず満足しています。

未分類

組織から「やれ」と言われたら、なんでもやるのがサラリーマンです。

とは言え、『この歳になって、Java(×JavaScript)かぁ』と、少々意外な感じです。

私、C/C++, Go, Python、SQL、JavaScriptは、普通にしゃべれますが、そのすきまを狙ったかのような"Java"とは ―― うん、面倒ですが、仕方ありません。

という訳で、今、VSCodeの環境にJava開発環境を仕込んでいます。

しかし、こんなトラブルが発生していて、ChatGPTと議論をしていました。

public class App {
public static void main(String[] args) throws Exception{
System.out.println("Hello, World!");
}
}
vscodeを使って、F5で実行しようとしたのですが、
Missing artifact org.json:json:jar:20140107
Missing artifact redis.clients:jedis:jar:2.7.2
等がでてきます。
コマンドからはちゃんとコンパイルして実行できるようですが。

色々教えて貰い、他のツールを入れたりしないように言われましたが、VSCodeの拡張機能で、同じような機能入っているようなので、『???』となやんでいました。

で、今回は、こちらが私には当たりでした。

VSCodeでJavaを始める方法(環境構築)

まあ、Javaだろうと、C/C++だろうと、Goだろうと構いません。今回の私の真の目的は、Github Copilotの攻略ですから。

GitHub Copilotが『怖い』件

以前、ChatGPTの登場で、英語の教師が本気でヤバイかもしれない、とか書きました。

私は生れて始めて『AI技術による廃業』の予感を感じました ―― 最初の犠牲者は、語学教師です。

Copilotでは、ソフト外注が ―― というか、今なお、現場でコーディングをやっている、この私(江端)が、本気でヤバい。

しかし、これ、もしかしたら、良い意味で「ヤバい」かもしれません。

ChatGPTやGitHub Copilotと、ガチで語り合えるスキルがあってこそ、彼らを使い倒すことができると思えるからです。

生成AIを使い倒す技能は、場数を踏んできたシニアの方が上手いと思う。

だから、これはチャンスだ ―― と、そう思うことにします、当面の間は。

未分類

その1
Go言語で、250人分のエージェントを作成して、次の処理にかかろうとして
"for"
と書いただけで、
    for i := 0; i < 250; i++ {
        fmt.Println("person[", i, "].Origin:", person[i].Origin.Name, person[i].Origin.Loc.Lng, person[i].Origin.Loc.Lat)
        fmt.Println("person[", i, "].Destination:", person[i].Destination.Name, person[i].Destination.Loc.Lng, person[i].Destination.Loc.Lat)
        fmt.Println("person[", i, "].Route:", person[i].Route)
    }

と、ここまで、自動的にコードを提案された。

その2
Go言語で、
// 時速4kmの場合、1秒間に移動する距離は、
と書いたら、
Copilotが、その後ろに、
4km/h ÷ 3600s/h = 0.00111111111km = 1.11111111m
と、文案を提案してきた。
正直、怖い

未分類

このコードが上手く起動できていない。

fastapi6/main.pyを参照のこと

import asyncio
from fastapi import FastAPI

app = FastAPI()

async def print_hello():
    while True:
        print("Hello")
        await asyncio.sleep(60)  # 60秒待機

@app.get("/aisatu")
async def get_aisatu():
    return {"message": "konnichiwa"}

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.create_task(print_hello())  # "Hello"出力プログラムを非同期タスクとして実行
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

未分類

先日、消火器を調べていたところ、耐用年数を超えていることが分かったので、交換することにしました。
思ったよりお高くて、驚いたのですが、火災のコストに比べれば安いものです。

で、古い消火器を玄関の外で試したのですが、
(1)消火器は一度放射を始めると止まりません(レバーを元に戻しても噴射が続く)
(2)消火器の消火用噴粒で、我が家の玄関と車庫は、ピンク色に染まっています。

以上