【问题标题】:I Want to display image in picturebox directly after loading through imread (opencv)我想通过imread(opencv)加载后直接在图片框中显示图像
【发布时间】:2015-05-27 13:08:54
【问题描述】:

我正在 Visual Studio 2010 中制作一个 Windows 窗体应用程序。 我接受了buttonpicture box。 我正在从内存中读取一张图片,我希望这张图片直接显示在图片框中,而不是保存在内存中。

以下代码是保存图像,然后将其加载到图片框中。 如何改进此代码以完成所需的任务。

 #pragma endregion  private: System::Void btn1_Click(System::Object^  sender, System::EventArgs^  e) {
> 
>                Mat im = imread("C:/Users/Ravi Sharma/Desktop/Koala.jpg");
>     if (im.empty()) 
>     {
>         cout << "Cannot load image!" << endl;
>         exit;
>     }
> 
>   imwrite("C:/Users/Ravi Sharma/Desktop/Koalanew.jpg",im);
>     imshow("Image", im);  
>  picturebox->Image=Image::FromFile("C:/Users/Ravi Sharma/Desktop/Koalanew.jpg");
>            }

经过一些改进 我的新代码是

> System::Void btn1_Click(System::Object^ sender, System::EventArgs^ e) 
> {
>     cv::Mat cvImage = cv::imread("C:/Users/Ravi Sharma/Desktop/Koala.jpg");
> 
>     if (cvImage.empty()) 
>     {
>         cout << "Cannot load image!" << endl;
>         exit;
>     }
> 
>     Bitmap^ bmImage = gcnew Bitmap(cvImage.cols, cvImage.rows, 3 * cvImage.cols, PixelFormat.Format24bppRgb, IntPtr(cvImage.data));
>     Image^ image = static_cast<Bitmap^>(bmImage); 
>      picturebox->Image=Image.bmImage;
>       }

【问题讨论】:

    标签: c++ visual-studio-2010 user-interface opencv picturebox


    【解决方案1】:

    您可以从指向包含像素数据的字节数组的指针创建一个Bitmap(在您的情况下,这是一个cv::Mat 对象),然后将其转换为Image

    System::Void btn1_Click(System::Object^ sender, System::EventArgs^ e) 
    {
        cv::Mat cvImage = cv::imread("C:/Users/Ravi Sharma/Desktop/Koala.jpg");
    
        if (cvImage.empty()) 
        {
            std::cout << "Cannot load image!" << std::endl;
            return;
        }
    
        DrawCvImage(cvImage);
    }
    
    System::Void DrawCvImage(const cv::Mat& cvImage) 
    {
        // only color images are supported
        assert(cvImage.type() == CV_8UC3);
    
        if ((pictureBox->Image == nullptr) || (pictureBox->Width != cvImage.cols) || (pictureBox->Height != cvImage.rows))
        { 
            pictureBox->Width = cvImage.cols; 
            pictureBox->Height = cvImage.rows; 
            pictureBox->Image = gcnew System::Drawing::Bitmap(cvImage.cols, cvImage.rows); 
        }
    
        // Create System::Drawing::Bitmap from cv::Mat
        System::Drawing::Bitmap^ bmpImage = gcnew Bitmap(
            cvImage.cols, cvImage.rows, cvImage.step, 
            System::Drawing::Imaging::PixelFormat::Format24bppRgb, 
            System::IntPtr(cvImage.data)
        ); 
    
        // Draw Bitmap over a PictureBox
        Graphics^ g = Graphics::FromImage(pictureBox->Image); 
    
        g->DrawImage(bmpImage, 0, 0, cvImage.cols, cvImage.rows);  
        pictureBox->Refresh(); 
    
        delete g; 
    }
    

    【讨论】:

    • 如何在图片框中显示位图图像? @Kornel
    • 只需将位图复制到pictureBox.Image
    • 现在我已经编辑了我的代码,但它仍然没有加载图像。这是将位图图像复制到图片框@Kornel的方法吗?
    • 感谢您的帮助。我使用了您的代码,但它没有在图片框中显示图像。请帮我在图片框中显示图像。
    猜你喜欢
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多