質問編集履歴

3 書式の改善

Ken.Satooo

Ken.Satooo score 9

2018/07/20 13:04  投稿

動画の顕著性マップ出力について(BinWangApr2014
動画の顕著性マップ出力について(opencv_contrib/saliency
### 前提・実現したいこと
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 の根本的な問題なのでしょうか...  
### ソースコード
``` C++
#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();
};
```
###
```C++
#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
```
### 試したこと  
画像の顕著性マップ(SPECTRAL_RESIDUAL, FINE_GRAINED)は出力に成功していたので, update関数内のBinWangApr2014での処理を画像の顕著性マップの処理に置き換えたところ, 顕著性マップが施された動画が出力されました.  
 
### 補足情報(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
  • C++

    4501 questions

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

  • C

    4637 questions

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

  • MacOS(OSX)

    2387 questions

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

  • OpenCV

    1551 questions

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

  • openFrameworks

    92 questions

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

2 文法の修正

Ken.Satooo

Ken.Satooo score 9

2018/07/12 14:18  投稿

顕著性マップ(動画:BinWangApr2014)の出力について
動画の顕著性マップ出力について(BinWangApr2014)
### 前提・実現したいこと
https://github.com/opencv/opencv_contrib/blob/master/modules/saliency/samples/computeSaliency.cpp
上記のサイトにて公開されているソースコードを参考に質問させていただきます.
動画データを顕著性マップにかけようと試みたのですが, 出力結果が真っ黒になってしまい上手く出力されません.
デバックして調べたところ動画データの読み込みは確認できたのですが, 動画の顕著性(BinWangApr2014)の処理(computeSaliency)を施すと, 1フレームごとに出力されるMatデータのピクセル全てが1(同一)になってしまい, その結果同一色(真っ黒)になってしまうことが判明しました.正規化の値を50に設定すると出力結果の画面は全て灰色になります.
OpenCv_contrib に含まれている saliency の BinWangApr2014 を用い, 動画データを顕著性マップにかけようと試みたのですが, 出力結果が真っ黒になってしまい上手く出力されません.
デバックして調べたところ動画データの読み込みは確認できたのですが, 動画の顕著性の処理( computeSaliency )を施すと, 1フレームごとに出力される Mat データのピクセル全てが1(同一)になってしまい, その結果同一色(真っ黒)になってしまうことが判明しました.正規化の値を50に設定すると出力結果の画面は全て灰色になります.
この解決方法がわかる方は, 是非ご教授お願いいたします.
### ソースコード
``` C++
#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();
};
```
###
```C++
#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
```
### 試したこと
画像の顕著性マップ(SPECTRAL_RESIDUAL, FINE_GRAINED)は出力に成功していたので, update関数内のBinWangApr2014での処理を画像の顕著性マップの処理に置き換えたところ, 顕著性マップが施された動画が出力されました.
### 補足情報(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
  • C++

    4501 questions

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

  • C

    4637 questions

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

  • MacOS(OSX)

    2387 questions

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

  • OpenCV

    1551 questions

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

  • openFrameworks

    92 questions

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

1 文法の修正

Ken.Satooo

Ken.Satooo score 9

2018/07/10 18:19  投稿

顕著性マップ(動画:BinWangApr2014)の出力について
### 前提・実現したいこと
https://github.com/opencv/opencv_contrib/blob/master/modules/saliency/samples/computeSaliency.cpp
上記のサイトにて公開されているソースコードを参考に質問させていただきます.
動画データを顕著性マップにかけようと試みたのですが, 出力結果が真っ黒になってしまい上手く出力されません.
デバックして調べたところ動画データの読み込みは確認できたのですが, 動画の顕著性(BinWangApr2014)の処理(computeSaliency)を施すと, 1フレームごとに出力されるMatデータのピクセル全てが1(同一)になってしまい, その結果同一色(真っ黒)になってしまうことが判明しました.正規化の値を50に設定すると出力結果の画面は全て灰色になります.
この解決方法がわかる方は, 是非ご教授お願いいたします.
### ソースコード
``` C++
#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();
};
```
###
```C++
#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になってしまう
   // 顕著性マップ(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
```
### 試したこと
画像の顕著性マップ(SPECTRAL_RESIDUAL, FINE_GRAINED)は出力に成功していたので, update関数内のBinWangApr2014での処理を画像の顕著性マップの処理に置き換えたところ, 顕著性マップが施された動画が出力されました.
### 補足情報(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
  • C++

    4501 questions

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

  • C

    4637 questions

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

  • MacOS(OSX)

    2387 questions

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

  • OpenCV

    1551 questions

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

  • openFrameworks

    92 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る