Как отобразить cv :: Mat в приложении Windows Form? - PullRequest
2 голосов
/ 06 марта 2012

Я пытался использовать imwrite, чтобы успешно отобразить изображение в форме Windows, но это повреждает диск, поэтому мне нужен лучший способ сделать это.

Ниже приведен мой текущий код,который временно записывает образ на жесткий диск:

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

        namedWindow("video",0);
        VideoCapture cap(0);
        flag = true;
        while(flag){
            Mat frame;
            cap >> frame; // get a new frame from camera
            **imwrite("vdo.jpg",frame);**
            this->panel1->BackgroundImage = System::Drawing::Image::FromFile("vdo.jpg");

            waitKey(5);
            delete panel1->BackgroundImage;
            this->panel1->BackgroundImage = nullptr;

        }
    }

Когда я пытаюсь использовать OpenCV Mat, который находится в памяти, я не могу заставить его работать.Следующие фрагменты кода - это то, что я пробовал до сих пор:

this->panel1->BackgroundImage = System::Drawing::Bitmap(frame);

или

this->panel1->BackgroundImage = gcnew System::Drawing::Bitmap( frame.widht,frame.height,System::Drawing::Imaging::PixelFormat::Undefined, ( System::IntPtr ) frame.imageData);

Я хочу отобразить frame в этом коде без использования imwrite.Как мне это сделать?

1 Ответ

5 голосов
/ 08 марта 2012

Это определенно хорошая идея - отказаться от записи изображения в файл и затем сразу же вернуться к элементу управления. Это довольно неэффективно, поскольку жесткий диск обычно является самым медленным устройством памяти в системе.

Я не верю, что вы используете правильный конструктор Bitmap в вашем примере выше. Вероятно, вам следует использовать это определение конструктора. Кроме того, сообщение объекту Bitmap о том, что PixelFormat не определен, вероятно, тоже не поможет. Я предполагаю, что у вас есть цветная камера, которая возвращает матрицу CV_8UC3 (т. Е. Ваш PixelFormat == Format24bppRgb).

Как насчет того, чтобы позвонить вот так:

this->panel1->BackgroundImage = gcnew System::Drawing::Bitmap(frame.size().width,
                                                              frame.size().height,
                                                              frame.step,
                                                              PixelFormat::Format24bppRgb,
                                                              (IntPtr)frame.data);

Также помните, что OpenCV изначально сохраняет цвет в формате BGR. Поэтому вам может понадобиться поменять местами красный и синий каналы, чтобы данные выглядели правильно.

Надеюсь, это поможет вам начать!

...