先日ステラショットのセミナーを聞きながらデシケータに湿度計を取り付けるパーツを作っていたときに、「ライブビュー、そういえば載せていなかったなー」とふと思い、実装しました。備忘録としていくつかメモ。
まずEkosでライブビューを開始する場合、StreamingタブのStream Onボタンを押します。するとライブビューが開始されて、画像の解像度が 同じタブのWidthとHightに表示されます。

ライブビューを開始するところをソースにするとこんな感じ。EkosのStream On / Stream Offボタンは中では"CCD_VIDEO_STREAM"という名前で管理されていて、OnボタンにISS_ON, OffボタンにISS_OFFを入れてindi serverに送ってやればOK。これでライブビューが開始されます。
プレビューの解像度は"CCD_STREAM_FRAME”という名前で取得することができます。
これでプレビューの取得はできますが、プレビューではピントを合わせたりするために拡大したり拡大する位置を変更したりしたくなります。これEkosでやろうとするとなかなか厄介です。
まず受信する画像の解像度の変更と拡大率の変更を設定するのはこちら。"other"タブの "d1a3"が拡大率、"d1ac"が解像度です。

ニコンD5500では解像度はQVGA相当とVGA相当の2つから選択可能です。2を選択すると640x424画素の画像が取得できます。 画像のアスペクト比は3:2なので正しくは640x426.6666画素になるはずですが、カメラからはMJPEGで来るので解像度は4の倍数でなければならず、このような解像度になっています。この設定変更はライブビュー実行中でも可能で、ライブビュー中にこの変更をすると上記の"CCD_STREAM_FRAME”の値が変化します。
拡大率は 0~5から選択できて、0だと画像全体、5だと指定箇所をピクセル等倍で上記の解像度でクロップして取得します。その中間は、
0:画像全体
1:25%
2:33%
3:50%
4:66%
5:100%
となります。例えば5を選択すると、このように強拡大することができます。

このような設定は、カメラを制御するPTPコマンドのメーカ拡張として定義されていて、設定に出てきたよくわからない"d1a3"や"d1ac"は、メーカ拡張で定義されているプロパティID番号なります。この設定はメーカごとに違い、また物によっては同じメーカでも機種ごとに違うため、Ekosのような様々なデバイスに対応するソフトでは網羅するのは難しいだろうなと思います。ニコンの場合このようなコマンドの情報は、こちらから無料で入手することができます。
次は拡大する位置の変更です。これは"actions"タブの"changeafarea"で設定可能です。

ニコンD5500の解像度は6000x4000画素なので、半分の3000x2000を設定してやると、中央が選択されます。

そこでx軸を少し小さくして2500x2000とすると、少し左側を見ることができます。

次はこれを自分のNJPコントローラに組み込んでいきます。
まずEkosでライブビューを開始する場合、StreamingタブのStream Onボタンを押します。するとライブビューが開始されて、画像の解像度が 同じタブのWidthとHightに表示されます。

ライブビューを開始するところをソースにするとこんな感じ。EkosのStream On / Stream Offボタンは中では"CCD_VIDEO_STREAM"という名前で管理されていて、OnボタンにISS_ON, OffボタンにISS_OFFを入れてindi serverに送ってやればOK。これでライブビューが開始されます。
bool NikonCtrl::startLiveView()
{
//略
//start live view
svp = ccdNikon->getSwitch("CCD_VIDEO_STREAM");
svp->sp[0].s = ISS_ON;
svp->sp[1].s = ISS_OFF;
sendSwitch(svp);
mExposureStatus = LIVE_VIEWING;
//略
}
撮影したデータの受信は、静止画と同様newBLOB()関数で受け取ります。引数で渡されるbpの中にRGBのビットマップがそのまま入っているので、以下のソースではQtのQImageクラスのメモリにそのままビットマップデータをコピーしています。ただ解像度情報はbpには入っておらず、またその値は動的に変わるため、受信したフレームごとにその解像度を取得します。void NikonCtrl::newBLOB(IBLOB *bp)
{
//略
if(mExposureStatus == LIVE_VIEWING){
int wh[2];
getLiveViewImageSize(wh); //<-画像の画素数を取得
if(mCapImage.width() != wh[0] || mCapImage.height() != wh[1] || mCapImage.format() != QImage::Format_RGB888){
if(m_pImgTmpBuf != nullptr) delete [] m_pImgTmpBuf;
m_pImgTmpBuf = nullptr;
mCapImage = QImage(wh[0], wh[1],QImage::Format_RGB888);
}
uchar *p = mCapImage.bits();
memcpy(p, bp->blob, wh[0]*wh[1]*3);
emit onImageUpdated(true);
return ;
}
//略
プレビューの解像度は"CCD_STREAM_FRAME”という名前で取得することができます。
bool NikonCtrl::getLiveViewImageSize(int imSize[2])
{
if(ccdNikon == nullptr) return false;
INumberVectorProperty *nvp = ccdNikon->getNumber("CCD_STREAM_FRAME");
INumber *npW = IUFindNumber(nvp, "WIDTH");
INumber *npH = IUFindNumber(nvp, "HEIGHT");
imSize[0] = (int)(npW->value + 0.5);
imSize[1] = (int)(npH->value + 0.5);
return true;
}
これでプレビューの取得はできますが、プレビューではピントを合わせたりするために拡大したり拡大する位置を変更したりしたくなります。これEkosでやろうとするとなかなか厄介です。
まず受信する画像の解像度の変更と拡大率の変更を設定するのはこちら。"other"タブの "d1a3"が拡大率、"d1ac"が解像度です。

ニコンD5500では解像度はQVGA相当とVGA相当の2つから選択可能です。2を選択すると640x424画素の画像が取得できます。 画像のアスペクト比は3:2なので正しくは640x426.6666画素になるはずですが、カメラからはMJPEGで来るので解像度は4の倍数でなければならず、このような解像度になっています。この設定変更はライブビュー実行中でも可能で、ライブビュー中にこの変更をすると上記の"CCD_STREAM_FRAME”の値が変化します。
拡大率は 0~5から選択できて、0だと画像全体、5だと指定箇所をピクセル等倍で上記の解像度でクロップして取得します。その中間は、
0:画像全体
1:25%
2:33%
3:50%
4:66%
5:100%
となります。例えば5を選択すると、このように強拡大することができます。

このような設定は、カメラを制御するPTPコマンドのメーカ拡張として定義されていて、設定に出てきたよくわからない"d1a3"や"d1ac"は、メーカ拡張で定義されているプロパティID番号なります。この設定はメーカごとに違い、また物によっては同じメーカでも機種ごとに違うため、Ekosのような様々なデバイスに対応するソフトでは網羅するのは難しいだろうなと思います。ニコンの場合このようなコマンドの情報は、こちらから無料で入手することができます。
次は拡大する位置の変更です。これは"actions"タブの"changeafarea"で設定可能です。

ニコンD5500の解像度は6000x4000画素なので、半分の3000x2000を設定してやると、中央が選択されます。

そこでx軸を少し小さくして2500x2000とすると、少し左側を見ることができます。

次はこれを自分のNJPコントローラに組み込んでいきます。
コメント