静止画の処理を動画に反映させたい

4 views (last 30 days)
Eiji Ishioka
Eiji Ishioka on 19 Dec 2019
Commented: Eiji Ishioka on 23 Dec 2019
目的:動画内を流れる赤い玉の流速を求めたい
まず、赤玉を検出できるか判断するために イメージ内の円形オブジェクトの検出と測定 (https://jp.mathworks.com/help/images/detect-and-measure-circular-objects-in-an-image.html)を参考に静止画で検出しました。この際に、色のしきい値(アプリ)を利用することで検出させることが出来ました。
次に、静止画での処理を動画に反映させたいので 交通量のビデオ内の車の検出 (https://jp.mathworks.com/help/images/detecting-cars-in-a-video-of-traffic.html#d117e2854)を参考にしましたが、動画に反映させることが出来ません。
色のしきい値を調整し、関数のエクスポートを行いましたが反映させられていないようです。
以下 本文です。よろしくお願いいたします。
I=VideoReader('ーーーーmp4')
J=read(I,205);
imshow(J)
function [BW,maskedRGBImage] = createMask(RGB)
%createMask Threshold RGB image using auto-generated code from colorThresholder app.
% [BW,MASKEDRGBIMAGE] = createMask(RGB) thresholds image RGB using
% auto-generated code from the colorThresholder app. The colorspace and
% range for each channel of the colorspace were set within the app. The
% segmentation mask is returned in BW, and a composite of the mask and
% original RGB images is returned in maskedRGBImage.
% Auto-generated by colorThresholder app on 19-Dec-2019
%------------------------------------------------------
% Convert RGB image to chosen color space
I = rgb2lab(RGB);
% Define thresholds for channel 1 based on histogram settings
channel1Min = 0.000;
channel1Max = 100.000;
% Define thresholds for channel 2 based on histogram settings
channel2Min = 8.638;
channel2Max = 65.432;
% Define thresholds for channel 3 based on histogram settings
channel3Min = 17.003;
channel3Max = 64.797;
% Create mask based on chosen histogram thresholds
sliderBW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ...
(I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ...
(I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max);
BW = sliderBW;
% Initialize output masked image based on input image.
maskedRGBImage = RGB;
% Set background pixels where BW is false to zero.
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;
end
[centers,radii] = imfindcircles(BW,[15 29],'ObjectPolarity','dark','Sensitivity',0.89)
imshow(BW)
h = viscircles(centers,radii);
I =
VideoReader のプロパティ:
一般的なプロパティ:
Name: 'trytry.mp4'
Path: 'd:\Users\staff\Desktop\inpic'
Duration: 13.1626
CurrentTime: 0
NumFrames: <計算中...> 詳細を見る
ビデオ プロパティ:
Width: 1920
Height: 1080
FrameRate: 30
BitsPerPixel: 24
VideoFormat: 'RGB24'
function [BW,maskedRGBImage] = createMask(RGB)
エラー: このコンテキストでは関数定義はサポートされません。コードファイルで関数を作成してください。
  4 Comments
Shunichi Kusano
Shunichi Kusano on 20 Dec 2019
とりあえず検出はできたということですね。良かったです。
ご作成のコードですと動画から1フレームだけ読み込んで、赤玉検出するだけになっています。それは動いたということですので、あとは動画から順番に一枚ずつ読み込んで同じ処理を繰り返す、という風に書けばいいのですが…。
必要なものがわからなかったということですが、勉強始めだと何からやっていいかもわからないということはよくあります。が、「よくわかりません」ですと、こちらもどこまでわかっていて何がわかっていないのかがわからないため、何を答えればいいのかよくわかりません(笑)
以下は、あくまで私ならこうします、という話になりますがご参考まで。
まずサンプルコード(今回でいうと交通量のやつ)を100%理解するところから始めるのがいいかと思います。一行一行コマンドを見て何をやっているかを人に説明できるまで勉強します。わからない関数はdocumentationを見て調べます。ポイントは、各行で、何の変数を入力していて、それに対してどういう処理をして、得られた変数は何を表していてどういう形(配列なのかスカラーなのかとかデータ型とか)になっているか、といったあたりをちゃんと意識するといいと思います。各行の処理が理解できれば、あとはもう少し俯瞰で見て、処理の順番がなんでこうなっているのかとかまでわかれば完璧です。理解できたかどうかは、誰かに教えると思って、実際に声に出して説明してみればわかります。
そこまでわかれば、どこをどういう風に変えればいいかは自然とわかるんじゃないかと思います。変えていくときも、一気に変えようとせずに、一つずつ変えていって、結果が思った通りになるかを確認しながら作業を進めていくと、いいかと思います。
例えば今回で言うと、まず読み込む動画を差し替えて、きちんと表示されるか確認。次に、各フレームに対する処理を書き換えて行く。処理もいくつかステップがあると思うので、各ステップごとに確認していくのがいいです。なぜいちいち確認していくかというと、一気に変えた後で確認して動かなかったら、どこが悪いのか特定するまでに時間がかかってしまうからです。
まとめますと、まずサンプルを100%理解する、そのあとは、「ちょっと作って(変えて)確認」を繰り返す。
その過程で詰まるところが出てきた際には、また質問してください。その時は「エラーが出た。一行ずつ追加していって、このコマンドを加えたらエラーが発生するので、そこに問題があることまではわかったが、どうしても原因がわからない」とか、かなり具体的な質問になってくると思うので、こちらも答えやすくなりますので、一瞬で回答コメント付くと思います(保証はできませんが…)。
Eiji Ishioka
Eiji Ishioka on 23 Dec 2019
ご回答ありがとうございます。
おっしゃる通り、焦らずに調べて行きたいと思います。
またわからないことがあればよろしくお願いいたします。

Sign in to comment.

Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!