わたしはプログラムを使ってハードを隅々まで制御したいと考えています。何がしたいかを申しますとwin32apiを呼び出して利用するのではなく、直接書き込んだりしたいと思っていました。しかし、win32APIはオープンソースではないためAPI関数呼び出すことはできてもAPI関数を改造したり書き込むことはできないということでした。なので、
今までOPENCVの顔認識においてwin32APIなどの説明や使い方を散々聞いてきましたが、
OSがWindowsでwin32APIを使わずにwin32APIのようなカメラ入力が出来たりウィンドウ、画像表示ができるプログラムは無いか探しています。
<行いたいこと>
欲を言えばwin32APIを使わないでOPENCVが使えるようにOPENCV内のソースコードでwin32APIを利用した
カメラ機能やウィンドウのサイズ変換の部分をwin32APIではない別のカメラ機能やウィンドウのサイズを変更ができるwin32APIのようなプログラムに置き換えてみたいです。
そして以上のようなことは難易度は考慮しないとして可能か不可能か知りたいです。
自身で調べる限りではOSがLinuxでならGTK+などがありました。
もちろんLinuxで使われているGTK+をOPENCV内のソースコードでwin32APIを利用した
カメラ機能やウィンドウのサイズ変換の部分などをGTK+のプログラムで置き換えて使うことで、OPENCVが使えるならば私のやりたいこととしては成功と言えます。(私の本当にしたかったことができたといってもいいです。)
またwin32apiは書き込んだり見ることは出来ませんがGTK+は見ることも書き込むこともできるので個人として隅々まで制御できる欲が満たせます。(なにか間違ったことを言っているかもしれませんが。)
いつもいつもわがままで何を言っているかわけのわからないことばかり言って申し訳ありません。自分でも調べたり基礎を学習して少しでも皆様に何がやりたいかをお伝えしたいのですが私の理解力と地頭が悪いせいで皆様に不快な思いをさせてしまっています。
無知ゆえに厳しいお言葉などは見ていてつらいですが自業自得です。
どうか今回の質問にかんしてどうかよろしくお願いいたします。
付き合いきれないと思われても仕方ありませんが、どうかよろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答9件
0
言われているWin32APIというのがどこまでの話なのか判別できませんが、
「ハードを隅々まで制御」というのがハードを完全に自身のアプリの管理下に置いて直接動かしたい、というのであればそれは無理です。
ハードウェアの管理はOSが行う仕事なので完全な管理下に置く方法はないです。
ドライバを根本から書けばそれなりに制御できると思いますが、滅茶苦茶大変で膨大な知識が必要な割にはやることはコマンドのやり取り程度です。
WindowsはLinuxと違いOSの機能にウィンドウの管理機能がくっついていて入れ替えできないので、その枠組みの外でウィンドウを出す方法はありません。
また、画像はウィンドウの中に表示するので同じ理由で表示できません。
Windows上で動いている以上、どんなライブラリを使用しようともその最下層(OSのカーネルとやり取りする部分)には必ずWindowsのAPIがいます。
それがOSというものです。GTK+はただのラッパーにすぎません。
完全に制御したい気持ちはわからなくはないですが、PCではハード1つ動かすにも様々な知識が必要になるのでRaspberryPiなどの組み込みの世界でやったほうがいいと思います。
投稿2018/02/14 12:03
総合スコア2850
0
わたしはプログラムを使ってハードを隅々まで制御したいと考えています。
今時のPCは、ユーザーがハードウェアを隅々まで制御するには複雑すぎるのですよ。私が最初に手にしたプログラミング可能なコンピューターは8bitマシンで、今とは桁違いに規模が小さかったので、当時はハードウェアを隅々までしゃぶり尽くしたものですが(改造とかもいろいろやったな……)、今のPCではまず無理です。
ハードウェアをいじるには、様々なI/F規格(例えばPCIとかUSBとか)を覚えてそれに従ってデバイスと通信しなければいけません。当然通信プロトコル(コマンド等)はデバイス固有なので、デバイスのメーカーからマニュアルを入手しなければ通信のプログラムが書けません。メーカーに「マニュアルちょうだい」と言っても、くれるとはとても思えません。
<行いたいこと>
欲を言えばwin32APIを使わないでOPENCVが使えるようにOPENCV内のソースコードでwin32APIを利用した
カメラ機能やウィンドウのサイズ変換の部分をwin32APIではない別のカメラ機能やウィンドウのサイズを変更ができるwin32APIのようなプログラムに置き換えてみたいです。
そして以上のようなことは難易度は考慮しないとして可能か不可能か知りたいです。
難易度を考慮しないのなら不可能なことなんてありはしませんよ。現にマイクロソフトは作っていますし、LinuxのGPU制御も誰かが作ったものですし。
ただ、実質的には不可能だと思います。あなたがやりたいことはGPUのデバイスドライバーを作ることとほぼ同じです。私はその手の仕事をしたことがないのでよくは判りませんが、GPUベンダーと何らかの契約をしないとドライバー作成に必要な情報は得られないと思います。それに、自力でハードウェア制御を行うとなると、Windowsのウィンドウシステムとは完全に切り離されますので、それに代わる何かを作る必要があります。前にも書いたような気がするのですが、そこまで行くと、結局OSを作るのと同じレベルになります。
知識のない状態から始めて、一体何年かかるのか見当も付きません。
今もってあなたが何をやりたいのか判りません。なぜそこまでAPIを使うことを避けようとするのか。
あなたがハードウェアをいじってやろうとしていることは、すべてAPIを使ってできることです。APIやOpenCVのようなライブラリーを使えばたった1行で実現できる機能を、なぜ何年もかけて自作しようとするのか、さっぱり判りません。
投稿2018/02/14 14:12
編集2018/02/14 14:23総合スコア5938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
貴方の行動を登山に例えると
どこの山にも登ったことのない登山の素人が
何もわからないまま、既存の開拓済みの登山ルートを無視して、
手探りの暗中模索で冬のエベレストの登頂を目指していることです。
近場の簡単な登山(サンプル改造)から始めるか、まずは先人(ライブラリ)を学んでください。
自作自作といいますが、自作は結構たいへんです。
かなり端折ってますが、図で解説してみます。
OpenCV→Win32 API→KERNEL→デバイスドライバ→(USB 通信プロトコル)→カメラ
プログラム内で何らかの処理を行った時はこういう形でデータが流れると思ってください。
今回質問者様が Win32 APIを経由したくないとのことなので、
カメラ機能やウィンドウのサイズ変換を自作する時は、Win32 APIからKERNELの流れの部分を自作する必要があります。
投稿2018/02/14 11:47
編集2018/02/14 15:02総合スコア5846
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/14 15:40
2018/02/15 00:29
2018/02/15 15:22
2018/02/16 03:07
2018/02/16 03:08
2018/02/16 03:21
2018/02/16 07:31
2018/02/16 07:35
2018/02/16 13:58
2018/02/19 19:28
0
ベストアンサー
プログラムを使ってハードを隅々まで制御したいと考えています。
本当に隅々まで制御したいならハードウェアの知識が不可欠かつドライバ設計/実装の途方もないスキルが必要だが、その覚悟はおありだろうか。
隅々のレベルが判然としません。
GTK+で目的が達成されたとしても、GTK+だってその内部でLinuxのAPIモロモロを呼び出すことで実現しています。からくりは Win32-API + OpenCV と変わらんのです。
投稿2018/02/14 11:34
編集2018/02/14 11:37総合スコア16614
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/14 11:42
2018/02/14 11:49
2018/02/14 11:54
2018/02/14 11:59 編集
2018/02/14 12:09
2018/02/14 12:23 編集
2018/02/14 12:56
2018/02/14 13:48 編集
2018/02/14 14:41
2018/02/14 23:59 編集
2018/02/15 06:07
2018/02/15 06:15
2018/02/15 06:47
2018/02/15 08:01
2018/02/15 08:05
2018/02/15 13:12
2018/02/15 13:38
2018/02/15 17:09
2018/02/15 17:14
0
ハードを隅々まで制御したいのでしたら、そのハードウェアのデータシートをちゃんと読まないといけません。入手して読んでみましたか?英語で何10ページあるか何100ページあるか、ハードウェアによっていろいろですが。
とりあえず、USB video classのドキュメントを紹介します。
USB_Video_Class_1_5.zip
投稿2018/02/14 14:33
総合スコア702
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
わたしはプログラムを使ってハードを隅々まで制御したいと考えています。
この排他的な独占欲はOS上で動くアプリケーションを作成する以上満たされることはないでしょう。
なぜなら、複数のプロセスが同時に動く現代のOSの場合
ハードウェアに対して命令するのはあなたが作成したプロセスだけとは限らないからです。
なんらかの制約があり協調する事が求められます。
完全に制御したい場合OS自作する事が必要でしょう
LinuxのAPIがオープンだからといって改造すると
当然ながらあなたの環境でしか動かないものが出来上がります。
どうしても必要なら考えはしますが、いささかメリットに対してデメリットの方が大きいように思います。
実のところ、win32apiを用いずに目標を達成することは不可能ではないかもしれません。
ただし、その結果生まれるのは
非常に強く環境に依存し、win10で動いたものがwin8で動くとは限らない
それどころかwindows update毎に動かなくなる可能性があり、
同windowsでもマシン構成等で動かない可能性のある
アプリケーションです。
しかも、ライセンス的に真っ黒でマルウェアの作成くらいにしか使えません。
win32apiを用いることでwin10からwin95までソースコードレベルの互換性は保たれます。
win32apiはきちんとドキュメントの公開されているAPIです。
cv::imshowを追いかける事のできなかったアナタにとってLinuxのAPIとどれだけの違いがあるのか疑問です。
投稿2018/02/15 07:42
総合スコア15147
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/15 07:51
0
現実的ではない云々は、他の方がたくさん書かれていますので、学習を目的として、ある程度リッチなGUI OSから、低レベルなハードウェア制御を行う、という趣向で考えてみます。
まず、一旦Windowsは忘れましょう。そこでRaspberry Piの登場です。Raspberry PiにはLinuxの一種であるRaspbianというOSをインストールします。これを使うと、特権ユーザー権限ではなく、一般ユーザー権限で、GPIO(要するにマイコンボード基板にある電気信号のピン)をON/OFF制御することができます。それら電気信号の入出力をどう使うかは、すべて貴方次第ということになります。
Raspberry Piは X Window System というGUI環境が動作しますから、例えば、GPIOにつないだセンサーから値を読み取って、画面にグラフを書く、等ということも可能になります。ただ、カメラの制御は、相当複雑になりますから、こればかりは、Video for Linux というライブラリ(これもAPIの一種)のお世話にならざるを得ません。
ここで、私が先日Qiitaで書いた記事を紹介(宣伝)させていただきます。
▼ Raspberry Pi でGUIアプリ開発、初めての手引き
https://qiita.com/soramimi_jp/items/b2b238d1537dbb99abea
▼ Raspberry Pi のカメラモジュールで撮影
https://qiita.com/soramimi_jp/items/0127855cfa27a26b4c80
GUIアプリから外部ハードウェアを制御する最初の一歩になるのではないかと思います。
Windowsに話を戻すと、そもそもWindowsには通常、一般ユーザーが特権無しで自由に利用できるGPIOの様なものがありませんので、外部ハードウェアを制御するには、どうしても、デバイスドライバを利用するような仕組みが必要になってきます。
ひとつ勘違いしないでほしいのは、ユーザーが自由にハードウェアを制御できるからLinuxが優れているとか、デバイスドライバやAPIが面倒だからWindowsは劣っている、ということではない、という点です。Linuxだって、普通のPCで使う場合には、外部とのやりとりはデバイスドライバを介するのが当然です。一般ユーザー権限で直接ハードウェアを制御できたら、一瞬でセキュリティが破綻してしまいます。Raspberry Piはどちらかというと学習用途を主眼に開発されているので、その辺はちょっと甘く設計されています。ですので、わざわざデバイスドライバを作るまでもない、簡単なハードウェア制御は、一般ユーザー権限でもできる程度にお手軽になっています。
投稿2018/02/20 08:56
総合スコア12
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/20 10:47
2018/02/20 11:30
0
面白そうな話題なので自分も混ぜてください。
大学の頃まだPC9801等がバリバリの現役だった時代、ソースのあるBASICのゲームを他のマシン(UNIXなど)で動かせないかなと考え、描画関係のBASIC関数(命令)をすべてCで書き直したことがあります。
描画関係のみに絞るなら、大学生が片手間にちょこっとやって出来る程度の作業量です。
たとえば2点間を結ぶLINE等の命令を大学の図書室にあったPC向けの数学の本を参考に指定した位置にドットを置いていく命令を自前で作っていきました。
LINEだけではなくほかにも様々な描画命令がありますが、それらも基本的にそんな難しくなかったです。
※BASICにはなかったかもしれませんが、ベジエ曲線なんかも自前でやってみて大変面白いと思った記憶があります。
BASICとWin32APIとの違いはありますが、描画関数の数はそんなに違う物でもないでしょう。
座標系をいじる部分は行列などを駆使するので頭がこんがらがったりしそうではありますが。
最終的に「指定した座標に指定した色のドットを打つ」という命令になるのでそこの部分だけWin32APIを使うなりすれば、お求めのことが出来ると思います。
自前で表示の代用としてBitmapを用意し、そのBitmapにドットを打っていくのでもいいし。
ただし。
実行速度がとんでもなく遅くなったと言うことは申し添えておきます。
投稿2018/02/20 03:25
総合スコア10
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ちょっと面白い話なので参戦してみます。
(質問者さんには面白くないでしょうが)
質問者さんが言ってるのは「自由に何でもしたいんだ!」って事なんでしょうかね?
「**がしたいのにWin32のAPIの制限を受ける」
とかの不満かと思ってましたが、単純に「Win32を使いたくない」だけにみえたので。
でもWindowsを使っててハードウェアを触る限りはWin32の制限を間違いなく受けるでしょう。
制限って言うよりは使わずには作れないって言うべきかもしれません。
仮にWin32を使わずにハードを直接触ろうとした時点でWindowsのセキュリティを通過できないのではないでしょうかね?
ドライバ自体も今は署名がちゃんとしてないようなオリジナルドライバは動作させるのも難しかったような気がします。
ドライバ周りを触ることが私はないのでいい加減なこと言ってるかもしれませんが・・・
でもLinuxでもそれは一緒です。
多少ライセンス的に緩く作れる事はあるかもしれませんが「LINUXで開発する」以上は「LINUXの制限は必ず受ける」のです。
結局何もかも全てOS側の制限を受けずに自由にやりたかったら自作OSを作るしか無い!
でもそうすると他者さんも言ってますが、最低限PCのBootからコマンドラインが立ち上がるまでの部分すら自分で組まないと・・・・
APIを呼べば一行で出来る事を、自分で機械の認識からデータの取得まで全て自分でやることになります。
私は想像するだけでぞっとするのでそもそも試してみる気も無いのですが。
昔X68000の頃にイメージユニット関係を触ろうと思いましたがその頃の私には難易度が高すぎて断念した情けない想い出がよみがえりました・・・汗
投稿2018/02/14 17:37
総合スコア1614
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/15 06:05
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/14 12:11