2015-01-05 2 views
2

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

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; 
    } 
} 

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

ответ

0

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

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

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

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

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)

+0

Да, это хорошо работает. Спасибо:) – MaSza