質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

Windowsでwin32APIを使わずにカメラ機能やウィンドウを表示、画像表示が行えるようにするために。

解決済

回答 9

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 6,241

score 129

わたしはプログラムを使ってハードを隅々まで制御したいと考えています。何がしたいかを申しますと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+は見ることも書き込むこともできるので個人として隅々まで制御できる欲が満たせます。(なにか間違ったことを言っているかもしれませんが。)

いつもいつもわがままで何を言っているかわけのわからないことばかり言って申し訳ありません。自分でも調べたり基礎を学習して少しでも皆様に何がやりたいかをお伝えしたいのですが私の理解力と地頭が悪いせいで皆様に不快な思いをさせてしまっています。

無知ゆえに厳しいお言葉などは見ていてつらいですが自業自得です。
どうか今回の質問にかんしてどうかよろしくお願いいたします。
付き合いきれないと思われても仕方ありませんが、どうかよろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 9

+8

言われているWin32APIというのがどこまでの話なのか判別できませんが、
「ハードを隅々まで制御」というのがハードを完全に自身のアプリの管理下に置いて直接動かしたい、というのであればそれは無理です。
ハードウェアの管理はOSが行う仕事なので完全な管理下に置く方法はないです。
ドライバを根本から書けばそれなりに制御できると思いますが、滅茶苦茶大変で膨大な知識が必要な割にはやることはコマンドのやり取り程度です。

WindowsはLinuxと違いOSの機能にウィンドウの管理機能がくっついていて入れ替えできないので、その枠組みの外でウィンドウを出す方法はありません。
また、画像はウィンドウの中に表示するので同じ理由で表示できません。
Windows上で動いている以上、どんなライブラリを使用しようともその最下層(OSのカーネルとやり取りする部分)には必ずWindowsのAPIがいます。
それがOSというものです。GTK+はただのラッパーにすぎません。

完全に制御したい気持ちはわからなくはないですが、PCではハード1つ動かすにも様々な知識が必要になるのでRaspberryPiなどの組み込みの世界でやったほうがいいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/14 21:11

    そうですか。
    どうもありがとうございます。
    諦めてwin32apiを使います。

    キャンセル

+6

貴方の行動を登山に例えると

どこの山にも登ったことのない登山の素人が
何もわからないまま、既存の開拓済みの登山ルートを無視して、
手探りの暗中模索で冬のエベレストの登頂を目指していることです。

近場の簡単な登山(サンプル改造)から始めるか、まずは先人(ライブラリ)を学んでください。

自作自作といいますが、自作は結構たいへんです。


かなり端折ってますが、図で解説してみます。
イメージ説明
OpenCV→Win32 API→KERNEL→デバイスドライバ→(USB 通信プロトコル)→カメラ
プログラム内で何らかの処理を行った時はこういう形でデータが流れると思ってください。

今回質問者様が Win32 APIを経由したくないとのことなので、
カメラ機能やウィンドウのサイズ変換を自作する時は、Win32 APIからKERNELの流れの部分を自作する必要があります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/16 16:35

    ふぉろーありがとです。
    ...ま、そゆわけで何しようがしまいにはWin32-APIにたどり着くですよ。
    さもなくば strlen みたいな"副作用のないタダの計算"であるか。

    キャンセル

  • 2018/02/16 22:58

    返信が遅くなり申し訳ありません。
    asmさん、epistemeさんどうもありがとうございます。

    キャンセル

  • 2018/02/20 04:28

    >epistemeさん
    >asmさん
    フォロー回答ありがとうございました。

    キャンセル

+6

わたしはプログラムを使ってハードを隅々まで制御したいと考えています。

今時のPCは、ユーザーがハードウェアを隅々まで制御するには複雑すぎるのですよ。私が最初に手にしたプログラミング可能なコンピューターは8bitマシンで、今とは桁違いに規模が小さかったので、当時はハードウェアを隅々までしゃぶり尽くしたものですが(改造とかもいろいろやったな……)、今のPCではまず無理です。
ハードウェアをいじるには、様々なI/F規格(例えばPCIとかUSBとか)を覚えてそれに従ってデバイスと通信しなければいけません。当然通信プロトコル(コマンド等)はデバイス固有なので、デバイスのメーカーからマニュアルを入手しなければ通信のプログラムが書けません。メーカーに「マニュアルちょうだい」と言っても、くれるとはとても思えません。

<行いたいこと>
欲を言えばwin32APIを使わないでOPENCVが使えるようにOPENCV内のソースコードでwin32APIを利用した
カメラ機能やウィンドウのサイズ変換の部分をwin32APIではない別のカメラ機能やウィンドウのサイズを変更ができるwin32APIのようなプログラムに置き換えてみたいです。
そして以上のようなことは難易度は考慮しないとして可能か不可能か知りたいです。 

難易度を考慮しないのなら不可能なことなんてありはしませんよ。現にマイクロソフトは作っていますし、LinuxのGPU制御も誰かが作ったものですし。

ただ、実質的には不可能だと思います。あなたがやりたいことはGPUのデバイスドライバーを作ることとほぼ同じです。私はその手の仕事をしたことがないのでよくは判りませんが、GPUベンダーと何らかの契約をしないとドライバー作成に必要な情報は得られないと思います。それに、自力でハードウェア制御を行うとなると、Windowsのウィンドウシステムとは完全に切り離されますので、それに代わる何かを作る必要があります。前にも書いたような気がするのですが、そこまで行くと、結局OSを作るのと同じレベルになります。
知識のない状態から始めて、一体何年かかるのか見当も付きません。


今もってあなたが何をやりたいのか判りません。なぜそこまでAPIを使うことを避けようとするのか。

あなたがハードウェアをいじってやろうとしていることは、すべてAPIを使ってできることです。APIやOpenCVのようなライブラリーを使えばたった1行で実現できる機能を、なぜ何年もかけて自作しようとするのか、さっぱり判りません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+5

プログラムを使ってハードを隅々まで制御したいと考えています。

本当に隅々まで制御したいならハードウェアの知識が不可欠かつドライバ設計/実装の途方もないスキルが必要だが、その覚悟はおありだろうか。

隅々のレベルが判然としません。

GTK+で目的が達成されたとしても、GTK+だってその内部でLinuxのAPIモロモロを呼び出すことで実現しています。からくりは Win32-API + OpenCV と変わらんのです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/15 22:38

    実は7個前の質問で紹介済みです。
    https://teratail.com/questions/112501

    キャンセル

  • 2018/02/16 02:09

    そうなんですか、もう目的がわからないですね。

    キャンセル

  • 2018/02/16 02:14

    目的は元の質問から情報を得るたびに変わってきてしまい元の質問とはかけ離れたところに(私のせいで)いってしまうため、わけのわからないことになっています。
    すいませんでした。

    キャンセル

+4

ハードを隅々まで制御したいのでしたら、そのハードウェアのデータシートをちゃんと読まないといけません。入手して読んでみましたか?英語で何10ページあるか何100ページあるか、ハードウェアによっていろいろですが。
とりあえず、USB video classのドキュメントを紹介します。
USB_Video_Class_1_5.zip

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

わたしはプログラムを使ってハードを隅々まで制御したいと考えています。

この排他的な独占欲はOS上で動くアプリケーションを作成する以上満たされることはないでしょう。
なぜなら、複数のプロセスが同時に動く現代のOSの場合
ハードウェアに対して命令するのはあなたが作成したプロセスだけとは限らないからです。
なんらかの制約があり協調する事が求められます。
完全に制御したい場合OS自作する事が必要でしょう

LinuxのAPIがオープンだからといって改造すると
当然ながらあなたの環境でしか動かないものが出来上がります。
どうしても必要なら考えはしますが、いささかメリットに対してデメリットの方が大きいように思います。

実のところ、win32apiを用いずに目標を達成することは不可能ではないかもしれません。
ただし、その結果生まれるのは
非常に強く環境に依存し、win10で動いたものがwin8で動くとは限らない
それどころかwindows update毎に動かなくなる可能性があり、
同windowsでもマシン構成等で動かない可能性のある
アプリケーションです。
しかも、ライセンス的に真っ黒でマルウェアの作成くらいにしか使えません。

win32apiを用いることでwin10からwin95までソースコードレベルの互換性は保たれます。

win32apiはきちんとドキュメントの公開されているAPIです。
cv::imshowを追いかける事のできなかったアナタにとってLinuxのAPIとどれだけの違いがあるのか疑問です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/15 16:51

    おっしゃる通り、cv::imshowすら自己解決できなかった私が改造もできないであろうAPIについていろいろ言うのはおかしな話です。
    asmさんから言われたことは痛いほど正論である故、ただただ素直に認めるしかありません。

    キャンセル

+1

現実的ではない云々は、他の方がたくさん書かれていますので、学習を目的として、ある程度リッチな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 19:47

    ありがとうございます。
    ラズパイのGPUは難しいのでCPUで並列処理を過去に考えたことがありました。
    ちなみに紹介していただいたサイトのカメラはCPUでの処理でしょうか?
    CPUの並列処理などを使っているのかと思い質問しました。

    キャンセル

  • 2018/02/20 20:30

    カメラの制御まで自前で…となると、現実的ではない、となり、ご質問が堂々めぐりになってしまいますから、カメラから画像を取得する処理に限れば、Video for LinuxのAPIを使うのが良いでしょう。Raspberry Piのカメラでの画像取り込みが、CPUなのかGPUなのか、というのはこの際どうでもいいことで(←ここが質問者が疑問に感じられている要点かもしれませんが)、画像を取り込む方法が既に存在していて、ライブラリもあって、すぐに利用できる状態にあることこそが、もっとも重要なことです。カメラに搭載されているイメージセンサーを独自制御するにはどうしたら良いか、をお尋ねでしたら、teratailはたぶん相応しくありません。イメージセンサーのデータシートを隅々まで読んで試行錯誤するのは、ドライバ開発者がやればいいことです。質問者が、ドライバより低位層にご興味があるなら、イメージセンサーを作っているメーカー(SONYなど)で修行を積むしかないでしょう。手段はともかく、取り込んだ画像をどう処理するかは、CPUでやってもいいですし、Raspberry PiはOpenCVにも対応していますので、それを利用しても良いでしょう。Raspberry Piで性能が足りなければ、ネットワークを介して、画像処理専用マシンに丸投げしてやれば、NVIDIAやAMDのGPUも使い放題ですから、Raspberry Piで全部やろうとは思わないことです。汎用的なハードウェア制御を行いたいのか、カメラや画像処理に限定した処理を行いたいのか、最終的に実現したいことこそが重要で、CPUかGPUかというのは、やりたいことの要件を定義したあとで考えましょう。

    キャンセル

0

ちょっと面白い話なので参戦してみます。
(質問者さんには面白くないでしょうが)

質問者さんが言ってるのは「自由に何でもしたいんだ!」って事なんでしょうかね?

「**がしたいのにWin32のAPIの制限を受ける」
とかの不満かと思ってましたが、単純に「Win32を使いたくない」だけにみえたので。

でもWindowsを使っててハードウェアを触る限りはWin32の制限を間違いなく受けるでしょう。
制限って言うよりは使わずには作れないって言うべきかもしれません。

仮にWin32を使わずにハードを直接触ろうとした時点でWindowsのセキュリティを通過できないのではないでしょうかね?
ドライバ自体も今は署名がちゃんとしてないようなオリジナルドライバは動作させるのも難しかったような気がします。
ドライバ周りを触ることが私はないのでいい加減なこと言ってるかもしれませんが・・・

でもLinuxでもそれは一緒です。
多少ライセンス的に緩く作れる事はあるかもしれませんが「LINUXで開発する」以上は「LINUXの制限は必ず受ける」のです。

結局何もかも全てOS側の制限を受けずに自由にやりたかったら自作OSを作るしか無い!
でもそうすると他者さんも言ってますが、最低限PCのBootからコマンドラインが立ち上がるまでの部分すら自分で組まないと・・・・
APIを呼べば一行で出来る事を、自分で機械の認識からデータの取得まで全て自分でやることになります。

私は想像するだけでぞっとするのでそもそも試してみる気も無いのですが。

昔X68000の頃にイメージユニット関係を触ろうと思いましたがその頃の私には難易度が高すぎて断念した情けない想い出がよみがえりました・・・汗

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/15 15:05

    回答どうもありがとうございます。私の伝え方が悪かったようですが、決してwin32APIを使いたくないわけではありません。ただLinuxのAPIは改造したりいじれたり、中身がどのような構造になっているのか知ることができて勉強になるのですが、windowsのAPIでは見ることができないブラックボックスのままであるので自分の好きなようにいじったり改造できないためあまり好きではないのです。
    LinuxのAPIは自分なりに改造して根っからの好きなものに仕上げあれるので好きなのです。ブラックボックスの部分もありませんし。

    キャンセル

0

面白そうな話題なので自分も混ぜてください。

大学の頃まだPC9801等がバリバリの現役だった時代、ソースのあるBASICのゲームを他のマシン(UNIXなど)で動かせないかなと考え、描画関係のBASIC関数(命令)をすべてCで書き直したことがあります。

描画関係のみに絞るなら、大学生が片手間にちょこっとやって出来る程度の作業量です。
たとえば2点間を結ぶLINE等の命令を大学の図書室にあったPC向けの数学の本を参考に指定した位置にドットを置いていく命令を自前で作っていきました。
LINEだけではなくほかにも様々な描画命令がありますが、それらも基本的にそんな難しくなかったです。
※BASICにはなかったかもしれませんが、ベジエ曲線なんかも自前でやってみて大変面白いと思った記憶があります。

BASICとWin32APIとの違いはありますが、描画関数の数はそんなに違う物でもないでしょう。
座標系をいじる部分は行列などを駆使するので頭がこんがらがったりしそうではありますが。

最終的に「指定した座標に指定した色のドットを打つ」という命令になるのでそこの部分だけWin32APIを使うなりすれば、お求めのことが出来ると思います。
自前で表示の代用としてBitmapを用意し、そのBitmapにドットを打っていくのでもいいし。

ただし。
実行速度がとんでもなく遅くなったと言うことは申し添えておきます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • C++に関する質問
  • Windowsでwin32APIを使わずにカメラ機能やウィンドウを表示、画像表示が行えるようにするために。