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

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

ただいまの
回答率

90.48%

  • C++

    4506questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    1552questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

OpenCVを利用したC++の画像アニメーションで動作しない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,649

kyousuke

score 10

前提・実現したいこと

OpenCVを利用して、画像を横へ移動(アニメーション)したいです。
また、画像が一定の位置まで言った場合戻ってくるアニメーションにしたいです。

発生している問題・エラーメッセージ

エラーは発生しないのですが、結果の画面が出力されない(動作停止になってしまう)です。
なので、移動しているかも確認できていません。

該当のソースコード

#include <iostream>
#include "opencv2\opencv.hpp"
using namespace cv;

int x;


int main(int argc, char* argv[])
{
     x=0;
    cv::Mat baseimage(cv::Size(1000, 600), CV_8UC3);
    cv::Mat img1 = cv::imread("pa_dot.png");
    cv::Mat img4 = cv::imread("test4.jpg");

    cv::Mat Roi4(baseimage, cv::Rect(0, 0, img4.cols, img4.rows));
    img4.copyTo(Roi4);

    cv::namedWindow("test", CV_WINDOW_AUTOSIZE);



    while (1){
        x += 1;


        if (x >= 500){

            x = 0;
        }


        cv::Mat Roi1(baseimage, cv::Rect(x, 0, img1.cols, img1.rows)); //画像の座標 Player1
        img1.copyTo(Roi1);


                cv::imshow("test", baseimage);        /* 画像の表示 */

    }

    waitKey(0);                        /* 入力待機 */
    return 0;
}

試したこと

while文以外もfor文でも試しましたが結果は同じく動作が停止してしまいます。

補足情報(言語/FW/ツール等のバージョンなど)

繰り返しの文が間違っているのか、また画像を表示させるが間違っているのか
C++初心者なので、ぜんぜんわからない状態です。
改善点、修正点お願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

OpenCVはあまり使ったことがないので、正確に理解しているわけではないのですが、

cv::namedWindow("test", CV_WINDOW_AUTOSIZE);

これはWhileループの手前に書くべきですね。リファレンスによると、すでに同じ名前のウィンドウがある場合は何もしないようなのでループの中に書いても問題にはなりませんが、無駄なので。

cv::imshow("test", baseimage);        /* 画像の表示 */

おそらく、これだけではWM_PAINTが処理されないために画像が表示されないのだと思われます。
というのも、cv::waitKeyの説明のところに、

注意: この関数は,HighGUI においてイベントを取得して扱うための唯一の手段です.よって,実行環境がイベント処理を扱ってくれる場合を除けば,通常のイベント処理ではこの関数を周期的に呼び出す必要があります.

と書いてあります。したがって、

cv::imshow("test", baseimage);
cv::waitKey(1);


このように、cv::imshowの後で必ずcv::waitKey(1)を呼ぶようにすれば表示されると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/11 22:58

    ありがとうございます、解決できました。

    キャンセル

+1

こんにちは。

とりあえずxを初期化してないようです。運良く500を超えていたら0クリアされますが、符の値だったりすると異常動作しそうです。

他にOpenCVの質問でたいへんよくあるのですが、img1やimg4をちゃんと読み出せていない可能性があります。
imread()の直後で何か適当にWindowをnamedWindow()で開いてimshow()してみましょう。
もし、表示されずに落ちるようでしたら、画像ファイルを読めていません。
間違いなくするため、'C:\'当たりに画像ファイルをおいて、それをフル・パスで指定してみると良いです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/11 22:20

    > とりあえずxを初期化してないようです。

    xはグローバル変数なので、よほど特殊な処理系でない限り0で初期化されますよ。

    キャンセル

  • 2016/07/11 22:20

    画像はwhile文なしなら表示できましたが、mainの中whileの前あたりにx=0;と初期化しても動作してくれないです・・

    キャンセル

  • 2016/07/11 22:47

    catsforepawさん。フォローありがとうです。確かにそうでした。
    大昔のC言語の記憶が更新されてませんでした;;

    kyousukeさん。
    catsforepawさんの指摘通り、xの初期化の件は私の記憶違いでした。(でも、特に理由がない限り、明示的に初期化する習慣を付けておいた方が安全ですよ。)

    もう少し現象を教えて下さい。
    while文有りの時は1回も画像が表示されないのでしょうか?
    それとも1回だけ表示されて2回目が表示されないのでしょうか?

    あ、cv::namedWindow()はwhile()文の前に移動する必要があるような気がします。
    2回以上、同じウィンドウを作るとおかしなことになりそうです。

    キャンセル

  • 2016/07/11 22:53

    cv::namedWindow()はwhileの前に移動させました。実行されたときに、画面が灰色(読み込み中)のままになってしまい、応答なしになってしまいます。

    キャンセル

  • 2016/07/11 22:59

    色々な回答ありがとうございました。waitkeyの場所を変更したら解決しました。

    キャンセル

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

  • C++

    4506questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    1552questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。