3

スクリプトを IplImage から CvMat 構造に変換する際に小さな問題があります。ほとんどのスクリプトでは問題はありませんが、ueye カメラから画像をキャプチャするための特定のスクリプトでは、IplImage を間に挟まずにこれを行う方法を見つけることができないようです。

私がやりたいことは、m_pcImageMemory を CvMat 構造に直接ロードすることです..しかし、これは CHAR です..そして cv::Mat は UCHAR を使用します。

空の cv::Mat を作成し、適切なヘッダーを作成し、 m_pcImageMemory を新しい cv::Mat にロードする方法の例を誰かが持っていますか?

以下の私のコードを見てください:

cv::Mat getframeMat_ueye(){
    if (m_hCam !=0) {
        if (is_CaptureVideo (m_hCam, IS_WAIT) == IS_SUCCESS) {
            is_RenderBitmap (m_hCam, m_lMemoryId, m_hWndDisplay, m_nRenderMode);
        }
    }


    IplImage* tmpImg = cvCreateImageHeader (cvSize (m_nSizeX, m_nSizeY), IPL_DEPTH_8U, m_channels);
    ueye_hasheader=true;
    tmpImg->imageData = m_pcImageMemory; 
    cv::Mat retmat=cv::cvarrToMat(tmpImg);
    cvReleaseImage(&tmpImg);

    return retmat;
}

マーティンのコメントに基づいて、コードを次のように変更しました。

cv::Mat getframeMat_ueye(){
    if (m_hCam !=0) {
        if (is_CaptureVideo (m_hCam, IS_WAIT) == IS_SUCCESS) {
            is_RenderBitmap (m_hCam, m_lMemoryId, m_hWndDisplay, m_nRenderMode);
        }
    }

    cv::Mat retmat(m_nSizeX, m_nSizeY,CV_8UC(m_channels),m_pcImageMemory);
    return retmat;
}

ただし、これを行うと、返された画像が歪んでおり、画像サイズも正しくありません。(サイズは横幅で前後あります。)

ご挨拶とありがとう、フロリス。

4

1 に答える 1

1

iplImage はもう使用しないでください。

cv::Mat mat(sizeX,sizeY,CV_8UC1,the_imagedata_camera);

明らかに、マットはデータが変更されていない間のみ有効です。char/uchar について心配する必要はありません。カメラからのデータはほぼ確実に署名されていません。

于 2012-11-10T00:10:37.890 に答える