現在、2つの別々のカメラ画像をAnaglyphという1つの画像にマージしようとしています。結果はthis image hereのようになります。 EmguCVとステレオ画像をミックスする方法は?
は、ここに私の私は2枚のカメラの画像をキャプチャするために書いたコードと&白黒に変換です:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.Util;
namespace CameraStereoCapture {
public partial class CameraStereoCapture : Form {
private bool captureInProgress;
private VideoCapture cameraLeft = null;
private VideoCapture cameraRight = null;
private Mat leftRawFrame;
private Mat rightRawFrame;
private Mat leftGrayFrame;
private Mat rightGrayFrame;
private Mat stereoFrame;
public CameraStereoCapture() {
InitializeComponent();
CvInvoke.UseOpenCL = false;
try {
cameraLeft = new VideoCapture(1);
cameraLeft.ImageGrabbed += ProcessFrame;
cameraRight = new VideoCapture(0);
cameraRight.ImageGrabbed += ProcessFrame;
} catch (NullReferenceException ex) {
MessageBox.Show(ex.Message);
}
leftRawFrame = new Mat();
rightRawFrame = new Mat();
leftGrayFrame = new Mat();
rightGrayFrame = new Mat();
stereoFrame = new Mat();
}
private void cmdCapture_Click(object sender, EventArgs e) {
if (cameraLeft != null) {
if (captureInProgress) {
// stop the capture
cmdCapture.Text = "Start Capture";
cameraLeft.Pause();
cameraRight.Pause();
} else {
// start the capture
cmdCapture.Text = "Stop Capture";
cameraLeft.Start();
cameraRight.Start();
}
captureInProgress = !captureInProgress;
}
}
private void ProcessFrame(object sender, EventArgs arg) {
// capture and cache image from left camera
if (cameraLeft != null && cameraLeft.Ptr != IntPtr.Zero) {
cameraLeft.Retrieve(leftRawFrame, 0);
imgLeft.Image = leftRawFrame;
}
// capture and cache image from right camera
if (cameraRight != null && cameraRight.Ptr != IntPtr.Zero) {
cameraRight.Retrieve(rightRawFrame, 0);
imgRight.Image = rightRawFrame;
}
// calculate stereo image by combining the left and right image
if (leftRawFrame != null && rightRawFrame!=null) {
CvInvoke.CvtColor(leftRawFrame, leftGrayFrame, ColorConversion.Bgr2Gray);
CvInvoke.CvtColor(rightRawFrame, rightGrayFrame, ColorConversion.Bgr2Gray);
// TODO: how to convert 'leftRawImage to Cyan' ???
// TODO: how to convert 'rightRawImage to Magenta' ???
CvInvoke.AddWeighted(leftGrayFrame, 0.5, rightGrayFrame, 0.5, 1.0, stereoFrame);
imgStereo.Image = stereoFrame;
}
}
}
}
私の質問ですが、私はCyan
とMagenta
またはRed
にグレー画像を変換する方法と、 Blue
(コードスニペットの行はTODO:
とマークされています)すべての3枚の画像(L、R、S)を仮定すると、赤シアンアナグリフステレオ画像を作るグリーンにimgStereoとimgRightのレッドチャンネルにimgLeftを入れてimgStereo
のブルーチャンネルに
ご提案いただきありがとうございます。私はC#/ EmguCVでこれを実装していますが、マトリックス - >画像変換は何とか遅すぎるように見えますが、キャプチャイベントが発生するのを待つことはできません。私は行列ベースのソリューション(質問の私のコードにcp。)を探しています。何か案は? – salocinx
私はEmguCVに精通していません。しかし、他の解決策は、上記のコードのように個々のピクセルにアクセスするのではなく、対処する全チャンネル(例えば、imgStoreのRチャンネル全体をコピーする)である可能性があります。 mixChannelsや[ここ]のようなマージ関数が可能です(http://stackoverflow.com/questions/20341910/opencv-taking-a-3-channel-rgb-image-splitting-channels-and-viewing-an-image-wi) )と[ここ](http://stackoverflow.com/questions/6699374/access-to-each-separate-channel-in-opencv) – Hardtack