I tried to use imwrite
to successfully to display an image on a Windows Form, but it damages the disk, so I need a better way to do this.
Below, is my current code, which writes the image temporarily to the hard drive:
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;
}
}
When I try to use the OpenCV Mat
that is in memory, I cannot get it to work. The following code snippets are what I have tried so far:
this->panel1->BackgroundImage = System::Drawing::Bitmap(frame);
or
this->panel1->BackgroundImage = gcnew System::Drawing::Bitmap( frame.widht,frame.height,System::Drawing::Imaging::PixelFormat::Undefined, ( System::IntPtr ) frame.imageData);
I want to display frame
in this code without using imwrite
. How do I accomplish this?
It is definitely a good idea to get away from writing the image to a file and then immediately reading back onto a control. It is quite inefficient as the hard drive is the slowest memory device in the system usually.
I do not believe you are using the correct
Bitmap
constructor in your example above. You should probably be using this constructor definition. Also, telling theBitmap
object that thePixelFormat
is undefined is probably not helping things either. I'm assuming you have a color camera that is returning aCV_8UC3
matrix (i.e., yourPixelFormat == Format24bppRgb
).How about try a call like this:
Also, remember that OpenCV natively stores color in BGR format. So, you may need to swap the red and blue channels to get the data to look right.
Hopefully, that will get you started!