Приложение формы OpenCV - конвертировать Mat в оттенки серого

У меня есть вопрос, который теоретически очень прост, но... только теоретически :) Я хочу преобразовать изображение матового кадра в оттенки серого. Я знаю, что я должен использовать что-то вроде этого:

cv::cvtColor(frameA1, grayImageA1, CV_BGR2GRAY);

Но результат таков:

http://i57.tinypic.com/jfvodt.jpg

Я не знаю, почему у меня есть 3 изображения в одном после преобразования в оттенки серого. Это часть моего кода:

  private: System::Void backgroundWorker1_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
    BackgroundWorker^ worker = dynamic_cast<BackgroundWorker^>(sender);
    capture1.open(1);
    while (camStatus1){
        if (camBusy1) continue;
        capture1.read(frameA1);
        if (frameA1.empty()) continue;
        cv::cvtColor(frameA1, grayImageA1, CV_BGR2GRAY);
        worker->ReportProgress(1);
    }

}
private: System::Void backgroundWorker1_ProgressChanged(System::Object^  sender, System::ComponentModel::ProgressChangedEventArgs^  e) {
    if (!camBusy1){
        camBusy1 = 1;
        System::Drawing::Graphics^ graphics = imageBox1->CreateGraphics();
        System::IntPtr ptr(frameA1.ptr());
        System::Drawing::Bitmap^ b = gcnew System::Drawing::Bitmap(frameA1.cols, frameA1.rows, frameA1.step, System::Drawing::Imaging::PixelFormat::Format24bppRgb, ptr);
        System::Drawing::RectangleF rect(0, 0, imageBox1->Width, imageBox1->Height);
        graphics->DrawImage(b, rect);
        if (debugA){
            System::Drawing::Graphics^ graphics = imageBox3->CreateGraphics();
            System::IntPtr ptr(grayImageA1.ptr());
            System::Drawing::Bitmap^ b = gcnew System::Drawing::Bitmap(grayImageA1.cols, grayImageA1.rows, grayImageA1.step, System::Drawing::Imaging::PixelFormat::Format24bppRgb, ptr);
            System::Drawing::RectangleF rect(0, 0, imageBox3->Width, imageBox3->Height);
            graphics->DrawImage(b, rect);
        }
        camBusy1 = 0;
    }
}

Есть идеи, почему это так работает? Я надеюсь, что вы можете помочь мне с этим теоретически простым вопросом :)


person MaSza    schedule 05.01.2015    source источник


Ответы (1)


Бьюсь об заклад, ваш вызов cvtColor() работает нормально (попробуйте imwrite() вывод и посмотрите сами), но затем:

вы пытаетесь скопировать 8-битное изображение с 24-битным пиксельным флагом:

System::Drawing::Bitmap^ b = gcnew System::Drawing::Bitmap(grayImageA1.cols, grayImageA1.rows, grayImageA1.step, System::Drawing::Imaging::PixelFormat::Format24bppRgb, ptr);

если вы хотите сохранить пиксельный флаг, вам придется снова преобразовать в 3 канала:

Mat grayImage24;
cv::cvtColor(grayImageA1, grayImage24, CV_GRAY2BGR);
System::Drawing::Bitmap^ b = gcnew System::Drawing::Bitmap(grayImage24.cols, grayImage24.rows, grayImage24.step, System::Drawing::Imaging::PixelFormat::Format24bppRgb, ptr);

(сейчас не могу попробовать, но iirc, нет возможности скопировать 8-битное изображение с помощью winforms)

person berak    schedule 05.01.2015