Get Pixel Image
========================================================================
#pragma once
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>
#include <msclr/marshal.h>
#include <iostream>
using namespace std;
using namespace cv;
namespace HistOpencv {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Runtime::InteropServices;
Mat src; // keep iamge
/// <summary>
/// Summary for MyForm
/// </summary>
public ref class MyForm : public System::Windows::Forms::Form
{
public:
MyForm(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~MyForm()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^ button1;
protected:
private: System::Windows::Forms::Button^ button2;
private: System::Windows::Forms::PictureBox^ pictureBox1;
private: System::Windows::Forms::Label^ label1;
private: System::Windows::Forms::PictureBox^ pictureBox2;
private: System::Windows::Forms::PictureBox^ pictureBox3;
private: System::Windows::Forms::PictureBox^ pictureBox4;
private: System::Windows::Forms::PictureBox^ pictureBox5;
private: System::Windows::Forms::PictureBox^ pictureBox6;
private: System::Windows::Forms::PictureBox^ pictureBox7;
private: System::Windows::Forms::PictureBox^ pictureBox8;
private:
/// <summary>
/// Required designer variable.
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
void InitializeComponent(void)
{
this->button1 = (gcnew System::Windows::Forms::Button());
this->button2 = (gcnew System::Windows::Forms::Button());
this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox());
this->label1 = (gcnew System::Windows::Forms::Label());
this->pictureBox2 = (gcnew System::Windows::Forms::PictureBox());
this->pictureBox3 = (gcnew System::Windows::Forms::PictureBox());
this->pictureBox4 = (gcnew System::Windows::Forms::PictureBox());
this->pictureBox5 = (gcnew System::Windows::Forms::PictureBox());
this->pictureBox6 = (gcnew System::Windows::Forms::PictureBox());
this->pictureBox7 = (gcnew System::Windows::Forms::PictureBox());
this->pictureBox8 = (gcnew System::Windows::Forms::PictureBox());
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox1))->BeginInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox2))->BeginInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox3))->BeginInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox4))->BeginInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox5))->BeginInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox6))->BeginInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox7))->BeginInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox8))->BeginInit();
this->SuspendLayout();
//
// button1
//
this->button1->Location = System::Drawing::Point(12, 29);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(75, 23);
this->button1->TabIndex = 0;
this->button1->Text = L"Browse";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
//
// button2
//
this->button2->Location = System::Drawing::Point(93, 29);
this->button2->Name = L"button2";
this->button2->Size = System::Drawing::Size(75, 23);
this->button2->TabIndex = 1;
this->button2->Text = L"Process";
this->button2->UseVisualStyleBackColor = true;
this->button2->Click += gcnew System::EventHandler(this, &MyForm::button2_Click);
//
// pictureBox1
//
this->pictureBox1->Location = System::Drawing::Point(12, 78);
this->pictureBox1->Name = L"pictureBox1";
this->pictureBox1->Size = System::Drawing::Size(373, 300);
this->pictureBox1->SizeMode = System::Windows::Forms::PictureBoxSizeMode::StretchImage;
this->pictureBox1->TabIndex = 2;
this->pictureBox1->TabStop = false;
//
// label1
//
this->label1->AutoSize = true;
this->label1->Location = System::Drawing::Point(12, 62);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(0, 13);
this->label1->TabIndex = 3;
//
// pictureBox2
//
this->pictureBox2->Location = System::Drawing::Point(391, 78);
this->pictureBox2->Name = L"pictureBox2";
this->pictureBox2->Size = System::Drawing::Size(382, 300);
this->pictureBox2->TabIndex = 4;
this->pictureBox2->TabStop = false;
//
// pictureBox3
//
this->pictureBox3->Location = System::Drawing::Point(779, 78);
this->pictureBox3->Name = L"pictureBox3";
this->pictureBox3->Size = System::Drawing::Size(400, 300);
this->pictureBox3->TabIndex = 5;
this->pictureBox3->TabStop = false;
//
// pictureBox4
//
this->pictureBox4->Location = System::Drawing::Point(391, 384);
this->pictureBox4->Name = L"pictureBox4";
this->pictureBox4->Size = System::Drawing::Size(382, 285);
this->pictureBox4->TabIndex = 6;
this->pictureBox4->TabStop = false;
//
// pictureBox5
//
this->pictureBox5->Location = System::Drawing::Point(779, 384);
this->pictureBox5->Name = L"pictureBox5";
this->pictureBox5->Size = System::Drawing::Size(400, 285);
this->pictureBox5->TabIndex = 7;
this->pictureBox5->TabStop = false;
//
// pictureBox6
//
this->pictureBox6->Location = System::Drawing::Point(15, 401);
this->pictureBox6->Name = L"pictureBox6";
this->pictureBox6->Size = System::Drawing::Size(370, 80);
this->pictureBox6->TabIndex = 8;
this->pictureBox6->TabStop = false;
//
// pictureBox7
//
this->pictureBox7->Location = System::Drawing::Point(15, 487);
this->pictureBox7->Name = L"pictureBox7";
this->pictureBox7->Size = System::Drawing::Size(370, 78);
this->pictureBox7->TabIndex = 9;
this->pictureBox7->TabStop = false;
//
// pictureBox8
//
this->pictureBox8->Location = System::Drawing::Point(15, 571);
this->pictureBox8->Name = L"pictureBox8";
this->pictureBox8->Size = System::Drawing::Size(370, 84);
this->pictureBox8->TabIndex = 10;
this->pictureBox8->TabStop = false;
//
// MyForm
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(1194, 681);
this->Controls->Add(this->pictureBox8);
this->Controls->Add(this->pictureBox7);
this->Controls->Add(this->pictureBox6);
this->Controls->Add(this->pictureBox5);
this->Controls->Add(this->pictureBox4);
this->Controls->Add(this->pictureBox3);
this->Controls->Add(this->pictureBox2);
this->Controls->Add(this->label1);
this->Controls->Add(this->pictureBox1);
this->Controls->Add(this->button2);
this->Controls->Add(this->button1);
this->KeyPreview = true;
this->Name = L"MyForm";
this->Text = L"MyForm";
this->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &MyForm::MyForm_KeyDown);
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox1))->EndInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox2))->EndInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox3))->EndInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox4))->EndInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox5))->EndInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox6))->EndInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox7))->EndInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->pictureBox8))->EndInit();
this->ResumeLayout(false);
this->PerformLayout();
}
#pragma endregion
private: System::Void MyForm_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e)
{
if (e->KeyCode == Keys::Escape)
{
if (MessageBox::Show("Do you want to exit program", "HistOPENCV", MessageBoxButtons::OKCancel, MessageBoxIcon::Warning) == System::Windows::Forms::DialogResult::OK)
{
Application::Exit();
}
}
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
OpenFileDialog^ open = gcnew OpenFileDialog();
open->Filter = "Image(*.jpg;*.bmp;*.png)|*.jpg;*.bmp;*.png";
if (open->ShowDialog() == System::Windows::Forms::DialogResult::Cancel)
{
return;
}
Bitmap^ bmpSrc = gcnew Bitmap(open->FileName);
pictureBox1->Image = bmpSrc;
pictureBox1->Refresh();
//Load Image into source variable and show as opencv method
src = imread(ConvertString2Char(open->FileName));
label1->Text = open->FileName->ToString();
}
private: char* ConvertString2Char(System::String^ str)
{
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
return str2;
}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e)
{
Mat gray, red, blue, green, rorate, binary, adaptivebinary, resizing;
resizing = ToResize(src);
gray = ToGray(resizing);
DrawCVImage(pictureBox2, gray);
binary = ToBinary(gray);
DrawCVImage(pictureBox3, binary);
adaptivebinary = ToAdaptiveBinary(gray);
DrawCVImage(pictureBox4, adaptivebinary);
rorate = ToRorate(resizing, 45, 1);
DrawCVImage(pictureBox5, rorate);
red = ToHistogram(resizing)[0];
green = ToHistogram(resizing)[1];
blue = ToHistogram(resizing)[2];
DrawCVImage(pictureBox6, red);
DrawCVImage(pictureBox7, green);
DrawCVImage(pictureBox8, blue);
}
private: Mat ToResize(Mat src)
{
Mat dst;
resize(src, dst, cv::Size(320, 240), 0, 0, 1);
return dst;
}
private: Mat ToGray(Mat src)
{
Mat dst;
cvtColor(src, dst, CV_RGB2GRAY);
return dst;
}
private: Mat ToBinary(Mat src)
{
Mat dst;
threshold(src, dst, 100, 255, CV_THRESH_BINARY);
return dst;
}
private: Mat ToAdaptiveBinary(Mat src)
{
Mat dst;
adaptiveThreshold(src, dst, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY,35, 5);
return dst;
}
private: Mat ToRorate(Mat src,double angle,double scale)
{
Mat dst;
Point2f center(src.cols / 2, src.rows / 2);
Mat mat_rot = getRotationMatrix2D(center, angle, scale);
warpAffine(src, dst, mat_rot, src.size());
return dst;
}
private: vector<Mat> ToHistogram(Mat src)
{
vector<Mat> result;
vector<Mat> img_rgb;
Mat img_r, img_b, img_g;
int chart_w = 400;
int chart_h = 400;
int size_histogram = 255;
float range[] = { 0,255 };
const float* hist_range = { range };
split(src, img_rgb);
calcHist(&img_rgb[0], 1, 0, Mat(), img_b, 1, &size_histogram, &hist_range, true, false);
calcHist(&img_rgb[1], 1, 0, Mat(), img_g, 1, &size_histogram, &hist_range, true, false);
calcHist(&img_rgb[2], 1, 0, Mat(), img_r, 1, &size_histogram, &hist_range, true, false);
int bin = cvRound((double)chart_w / size_histogram);
//Then we draw histogram here
Mat disp_r(chart_w, chart_h, CV_8UC3, Scalar(255, 255, 255));
Mat disp_g = disp_r.clone();
Mat disp_b = disp_r.clone();
normalize(img_b, img_r, 0, disp_b.rows, NORM_MINMAX, -1, Mat());
normalize(img_g, img_g, 0, disp_b.rows, NORM_MINMAX, -1, Mat());
normalize(img_r, img_b, 0, disp_b.rows, NORM_MINMAX, -1, Mat());
for (int i = 1; i < 255; i++)
{
line(disp_r, cv::Point(bin*(i), chart_h), cv::Point(bin*(i), chart_h - cvRound(img_r.at<float>(i))), Scalar(0, 0, 255), 2, 8, 0);
line(disp_g, cv::Point(bin*(i), chart_h), cv::Point(bin*(i), chart_h - cvRound(img_g.at<float>(i))), Scalar(0, 255, 0), 2, 8, 0);
line(disp_b, cv::Point(bin*(i), chart_h), cv::Point(bin*(i), chart_h - cvRound(img_b.at<float>(i))), Scalar(255, 0, 0), 2, 8, 0);
}
//push all 3 colors to the result variable
result.push_back(disp_r);
result.push_back(disp_g);
result.push_back(disp_b);
return result;
}
private: void DrawCVImage(System::Windows::Forms::Control^ control, cv::Mat& colorImage)
{
System::Drawing::Graphics^ graphics = control->CreateGraphics();
System::IntPtr ptr(colorImage.ptr());
System::Drawing::Bitmap^ b;
switch (colorImage.type())
{
case CV_8UC3: // non-grayscale images are correctly displayed here
b = gcnew System::Drawing::Bitmap(colorImage.cols, colorImage.rows, colorImage.step, System::Drawing::Imaging::PixelFormat::Format24bppRgb, ptr);
break;
case CV_8UC1: // grayscale images are incorrectly displayed here
b = gcnew System::Drawing::Bitmap(colorImage.cols, colorImage.rows, colorImage.step,System::Drawing::Imaging::PixelFormat::Format8bppIndexed, ptr);
break;
default:
break;
}
System::Drawing::RectangleF rect(0, 0, (float)control->Width, (float)control->Height);
graphics->DrawImage(b, rect);
}
};
}
Function ออกจากโปรแกรม