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

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

ただいまの
回答率

90.52%

  • C

    3664questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3433questions

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

  • MacOS(OSX)

    1896questions

    MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

  • OpenCV

    1066questions

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

  • openFrameworks

    82questions

    openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

動画の顕著性マップ出力について(opencv_contrib/saliency)

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 342

Ken.Satooo

score 7

 前提・実現したいこと

https://github.com/opencv/opencv_contrib/blob/master/modules/saliency/samples/computeSaliency.cpp

上記のサイトにて公開されているソースコードを参考に質問させていただきます.

OpenCv_contrib に含まれている saliency の BinWangApr2014 を用い, 動画データを顕著性マップにかけようと試みたのですが, 出力結果が真っ黒になってしまい上手く出力されません.
デバックして調べたところ動画データの読み込みは確認できたのですが, 動画の顕著性の処理( computeSaliency )を施すと, 1フレームごとに出力される Mat データのピクセル全てが1(同一)になってしまい, その結果同一色(真っ黒)になってしまうことが判明しました.正規化の値を50に設定すると出力結果の画面は全て灰色になります.

この解決方法がわかる方は, 是非ご教授お願いいたします.

 試したこと

画像の顕著性マップ(SPECTRAL_RESIDUAL, FINE_GRAINED)は出力に成功していたので, update関数内のBinWangApr2014での処理を画像の顕著性マップ(SPECTRAL_RESIDUAL, FINE_GRAINED)の処理に置き換えたところ, 顕著性マップが施された動画が出力されました.
となると BinWangApr2014 の根本的な問題なのでしょうか...

 ソースコード

#pragma once

#include "ofMain.h"
#include "ofxOpenCv.h"
#include "ofxCv.h"
#include "saliencySpecializedClasses.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
#include "opencv2/core/core.hpp"

using namespace std;
using namespace cv;
using namespace saliency;

class ofApp : public ofBaseApp {

public:
  void setup();
  void update();
  void draw();

// 省略

  // 動画
  ofVideoPlayer player;

  // 出力データ(白黒動画)
  ofImage outputOfImg4;

  // 顕著性マップ
  Mat saliencyMap_BinWangApr2014, saliencyMap_BinWangApr2014_2;
  // 出力される顕著性マップ
  Mat saliencyMap_BinWangApr2014_3;

  // BinWangApr2014(顕著性マップを求めるアルゴリズム : 動画)
  Ptr<MotionSaliencyBinWangApr2014> saliencyAlgorithm_BinWangApr2014 = MotionSaliencyBinWangApr2014::create();
};

 

#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){

  // 動画の読み込み
  ofBackground(255,255,255);
  ofSetVerticalSync(true);
  player.load("test.mp4");
  player.play();

  // 顕著性マップ(BinWangApr2014)の設定
  ofPixelsRef p = player.getPixels();
  Mat m = ofxCv::toCv(p).clone();

  saliencyAlgorithm_BinWangApr2014.dynamicCast<MotionSaliencyBinWangApr2014>()->setImagesize( m.cols, m.rows );
  saliencyAlgorithm_BinWangApr2014.dynamicCast<MotionSaliencyBinWangApr2014>()->init();

  ofLog()<<"m_cols : "<<m.cols;
  ofLog()<<"m_rows : "<<m.rows;
}

//--------------------------------------------------------------
void ofApp::update(){
  player.update();

  if(player.isFrameNew()){
    // 1フレームを取得
    ofPixelsRef pix = player.getPixels();
    // Mat変換
    Mat mat = ofxCv::toCv(pix).clone();
    // 白黒加工
    cvtColor( mat, mat, COLOR_BGR2GRAY );
    // 画像(ofImage)に変換 : 動いているのを確認
    ofxCv::toOf( mat, outputOfImg4 );
    outputOfImg4.update();

    // 顕著性マップ(BinWangApr2014)に変換 : 1フレームごとに出力されるMatデータのピクセル全てが1(同一)になってしまい,
    saliencyAlgorithm_BinWangApr2014->computeSaliency( mat.clone(), saliencyMap_BinWangApr2014 );

     ofLog()<<"saliencyMap_BinWangApr2014_cols : "<<saliencyMap_BinWangApr2014.cols;
    ofLog()<<"saliencyMap_BinWangApr2014_rows : "<<saliencyMap_BinWangApr2014.rows;
    ofLog()<<"saliencyMap_BinWangApr2014_type : "<< saliencyMap_BinWangApr2014.type();
    ofLog()<<"BinWangApr2014_at : "<<(int)saliencyMap_BinWangApr2014.at<uchar>(0,0);

    // アルファチャンネルの正規化を行う
    normalize( saliencyMap_BinWangApr2014.clone(), saliencyMap_BinWangApr2014_2, 0.0, 255.0, NORM_MINMAX);

    ofLog()<<"正規化 : "<<(int)saliencyMap_BinWangApr2014_2.at<uchar>(0,0);

    // Matの型(ビット深度)を変換する
    saliencyMap_BinWangApr2014_2.convertTo( saliencyMap_BinWangApr2014_3, CV_8UC3 );
    ofLog()<<"Matの型 : "<<(double)saliencyMap_BinWangApr2014_3.at<double>(0,0);

  }
}

//--------------------------------------------------------------
void ofApp::draw(){

  // 出力(動画)
  player.draw(0, 300, 300, 200);
  outputOfImg4.draw( 300, 300, 300, 200 );

  // 顕著性マップ(BinWangApr2014)を出力
  ofxCv::drawMat(saliencyMap_BinWangApr2014_3, 600, 300, 300, 200);
  // FPS出力
  ofDrawBitmapStringHighlight(ofToString(ofGetFrameRate()), 20, 20);
}

 出力結果

[notice ] saliencyMap_BinWangApr2014_cols : 1280
[notice ] saliencyMap_BinWangApr2014_rows : 720
[notice ] saliencyMap_BinWangApr2014_type : 0
[notice ] BinWangApr2014_at : 1
[notice ] 正規化 : 0
[notice ] Matの型 : 0

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

MacbookPro 10.13.5
macOS HighSierra
CMake 3.10.0-rc5
openFrameworks pre release v0.9.8
Xcode 9.3
openCv_4.3.2, openCv-contrib_4.3.2

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

まだ回答がついていません

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

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

関連した質問

  • 解決済

    opencvのcvConvertScaleAbs関数エラーを直したい

    こんにちは。 どうしても解決できず、ずっと悩んでいるのでご助力いただけないかと思い投稿しました。 前提・実現したいこと XcodeでC++、opencvを用いて行列操作を

  • 解決済

    byte配列のcv::Matへの画像変換

    byte配列に格納している画像データをMatに画像配列として保存します。この時、cv::imdecodeを使用しています。その後に画素値の変換をかけてcv::imencodeで再び

  • 解決済

    opencvでの画像の回転

    opencvを用いて読み込んだ画像の回転を行っています。 以下のプログラムで画像の回転を行い実行できたのですが、 画像が回転し、元の画像の場所が黒く表示されるのが気に入りません

  • 解決済

    opencv 動画 再生

    #include <stdio.h> #include <cv.h> #include <highgui.h> int main(int argc, char* argv[])

  • 解決済

    OpenCvSharp3で重心を求めたいです

    以下のように、ラベリングを実行するプログラムはできたのですが、ここから重心の座標や面積を求めるプログラムを作成したいです。どなたか、教えていただけますか? 最終的な目標としては

  • 解決済

    OpenCVによる画像マッチング

    前提・実現したいこと VisualStudio15 2017上でOpenCVを動かし、SIFT特徴量を用いた画像マッチングに取り組もうと思っています。 しかし、コンパイルで以下のエ

  • 解決済

    OpenCVを使った笑顔検出での問題

    前提・実現したいこと OpenCVで元からあるサンプルコード「smiledetect.cpp」を用いて笑顔検出のシステムを作っています。 検出機能を実装中に以下の問題が発生しました

  • 解決済

    OPENCVにおけるエラー

    openCVをはじめようとして、以下のエラーがでました。 プログラミング初心者です。 visual studio community 2017を使っています。 opencv3.3.

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

  • C

    3664questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3433questions

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

  • MacOS(OSX)

    1896questions

    MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

  • OpenCV

    1066questions

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

  • openFrameworks

    82questions

    openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。