Diplom_29-06 (1221240), страница 10
Текст из файла (страница 10)
StaticBitmap1->SetBitmap(bitmap);
//cvtColor(imageYUV420, imageYUV420, CV_YUV2RGBA_I420);
cv::resize(imageYUV420, imageYUV420, cv::Size(150, 150), 0.0, 0.0);
wxImage aswxImage2 = wxImage(imageYUV420.cols, imageYUV420.rows, imageYUV420.data, true);
wxBitmap bitmap2 = wxBitmap(aswxImage2);
StaticBitmap2->SetBitmap(bitmap2);
cv::resize(image2, image2, cv::Size(150, 150), 0.0, 0.0);
wxImage aswxImage3 = wxImage(image2.cols, image2.rows, image2.data, true);
wxBitmap bitmap3 = wxBitmap(aswxImage3);
StaticBitmap3->SetBitmap(bitmap3);
}
void PRJ_ON_OCVFrame::OnButton2Click(wxCommandEvent& event)
{
if (imageBase.rows==0) return; ///Ошибка открытия изображения
cv::Mat imageINPUT = imageBase; ///Входные и выходные изображения
cv::Mat imageOUTPUT = cvCreateMat( imageINPUT.rows, imageINPUT.cols, CV_8UC3 );
///Разбиение на каналы входного и выходного изображений
std::vector<cv::Mat> ChannelsInInput;
cv::split(imageINPUT,ChannelsInInput);
std::vector<cv::Mat> ChannelsInOutput;
cv::split(imageOUTPUT,ChannelsInOutput);
///Главный переключатель алгоритмов
switch (Choice1->GetSelection())
{
case 2: ///RGB to YUV 4:2:0
{
///Объявление массивов для хранения сжатого изображения
cv::Mat imageYUV420_YUV = cvCreateMat( imageINPUT.rows, imageINPUT.cols, CV_8UC3 );
cv::Mat imageYUV420_Y = cvCreateMat( imageINPUT.rows, imageINPUT.cols, CV_8UC1 );
cv::Mat imageYUV420_UV = cvCreateMat( imageINPUT.rows/2, imageINPUT.cols/2, CV_8UC2 );
///Разделение его на компоненты
std::vector<cv::Mat> channelsYUV420_UV;
cv::split(imageYUV420_UV,channelsYUV420_UV);
std::vector<cv::Mat> channelsYUV420_YUV;
cv::split(imageYUV420_YUV,channelsYUV420_YUV);
///Перевод в цветовую раскладку YUV
for( int i = 0; i < imageINPUT.rows; i++ )
{
for( int j = 0; j < imageINPUT.cols; j++ )
{
int R=ChannelsInInput[0].at<uchar>(i,j);
int G=ChannelsInInput[1].at<uchar>(i,j);
int B=ChannelsInInput[2].at<uchar>(i,j);
///Вычисление Y U V составляющих
channelsYUV420_YUV[0].at<uchar>(i,j)=0.299*R+0.587*G+0.114*B;
channelsYUV420_YUV[1].at<uchar>(i,j)=-0.14713*R-0.28886*G+0.436*B+128;
channelsYUV420_YUV[2].at<uchar>(i,j)=0.615*R-0.51499*G-0.10001*B+128;
}
}
///Архивирование
imageYUV420_Y=channelsYUV420_YUV[0]; ///Компонента Y имеет тот же размер поэтому просто приравнивается
for( int i = 0; i < imageINPUT.rows; i+=2 )
{
for( int j = 0; j < imageINPUT.cols; j+=2 )
{
///Берутся значения окружающих 4 пикселей
int Uthis=channelsYUV420_YUV[1].at<uchar>(i,j);
int Uright=channelsYUV420_YUV[1].at<uchar>(i+1,j);
int Udown=channelsYUV420_YUV[1].at<uchar>(i,j+1);
int Udiag=channelsYUV420_YUV[1].at<uchar>(i+1,j+1);
int Vthis=channelsYUV420_YUV[2].at<uchar>(i,j);
int Vright=channelsYUV420_YUV[2].at<uchar>(i+1,j);
int Vdown=channelsYUV420_YUV[2].at<uchar>(i,j+1);
int Vdiag=channelsYUV420_YUV[2].at<uchar>(i+1,j+1);
///Значения усредняются и записываются в соответстующие массивы
channelsYUV420_UV[0].at<uchar>(i/2,j/2)=(Uthis+Uright+Udown+Udiag)/4;
channelsYUV420_UV[1].at<uchar>(i/2,j/2)=(Vthis+Vright+Vdown+Vdiag)/4;
}
}
///Вывод на экран кадров данных после кодирования
if (CheckBox1->GetValue()==true)
{
cvNamedWindow("Y", CV_WINDOW_AUTOSIZE);
cv::imshow("Y", imageYUV420_Y);
cvNamedWindow("U", CV_WINDOW_AUTOSIZE);
cv::imshow("U", channelsYUV420_UV[0]);
cvNamedWindow("V", CV_WINDOW_AUTOSIZE);
cv::imshow("V", channelsYUV420_UV[1]);
}
///Объединение в одно изображение
cv::merge(channelsYUV420_YUV,imageYUV420_YUV);
///Вывод в окно 2
cv::resize(imageYUV420_YUV, imageYUV420_YUV, cv::Size(SIZE_IMAGE, SIZE_IMAGE), 0.0, 0.0);
wxImage aswxImage2 = wxImage(imageYUV420_YUV.cols, imageYUV420_YUV.rows, imageYUV420_YUV.data, true);
wxBitmap bitmap2 = wxBitmap(aswxImage2);
StaticBitmap2->SetBitmap(bitmap2);
///А теперь нужно разархивировать изображение
for( int i = 0; i < imageOUTPUT.rows; i++ )
{
for( int j = 0; j < imageOUTPUT.cols; j++ )
{
///Обратное вычисление RGB составляющих по коэффицентам
int R = (float)imageYUV420_Y.at<uchar>(i,j) + 1.13983 * ((float)channelsYUV420_UV[1].at<uchar>(i/2,j/2)-128);
if (R>255) R=255; if (R<0) R=0;
int G = (float)imageYUV420_Y.at<uchar>(i,j) -0.39465 * ((float)channelsYUV420_UV[0].at<uchar>(i/2,j/2)-128) - 0.58060 * ((float)channelsYUV420_UV[1].at<uchar>(i/2,j/2)-128);
if (G>255) G=255; if (G<0) G=0;
int B = (float)imageYUV420_Y.at<uchar>(i,j) + 2.03211 * ((float)channelsYUV420_UV[0].at<uchar>(i/2,j/2)-128);
if (B>255) B=255;
if (B<0) B=0;
ChannelsInOutput[0].at<uchar>(i,j)=(uchar)R;
ChannelsInOutput[1].at<uchar>(i,j)=(uchar)G;
ChannelsInOutput[2].at<uchar>(i,j)=(uchar)B;
}
}
///Вычисление коэффицента сжатия
wxString mystring4 = wxString::Format(wxT("%d%s"), imageINPUT.channels()*imageINPUT.cols*imageINPUT.rows," байт");
StaticText4->SetLabelText(mystring4);
wxString mystring5 = wxString::Format(wxT("%d%s"), imageYUV420_Y.cols*imageYUV420_Y.rows+imageYUV420_UV.channels()*imageYUV420_UV.cols*imageYUV420_UV.rows," байт");
StaticText5->SetLabelText(mystring5);
wxString mystringR = wxString::Format(wxT("%f"), (float)(imageINPUT.channels()*imageINPUT.cols*imageINPUT.rows) / (float)(imageYUV420_Y.cols*imageYUV420_Y.rows+imageYUV420_UV.channels()*imageYUV420_UV.cols*imageYUV420_UV.rows) );
StaticTextRatio->SetLabelText(mystringR);
break;
}
case 1: ///RGB to YUV 4:2:2
{
cv::Mat imageYUV420_YUV = cvCreateMat( imageINPUT.rows, imageINPUT.cols, CV_8UC3 );
cv::Mat imageYUV420_Y = cvCreateMat( imageINPUT.rows, imageINPUT.cols, CV_8UC1 );
cv::Mat imageYUV420_UV = cvCreateMat( imageINPUT.rows, imageINPUT.cols/2, CV_8UC2 );
std::vector<cv::Mat> channelsYUV420_UV;
cv::split(imageYUV420_UV,channelsYUV420_UV);
std::vector<cv::Mat> channelsYUV420_YUV;
cv::split(imageYUV420_YUV,channelsYUV420_YUV);
///Перевод в цветовую раскладку YUV
for( int i = 0; i < imageINPUT.rows; i++ )
{
for( int j = 0; j < imageINPUT.cols; j++ )
{
int R=ChannelsInInput[0].at<uchar>(i,j);
int G=ChannelsInInput[1].at<uchar>(i,j);
int B=ChannelsInInput[2].at<uchar>(i,j);
channelsYUV420_YUV[0].at<uchar>(i,j)=0.299*R+0.587*G+0.114*B;
channelsYUV420_YUV[1].at<uchar>(i,j)=-0.14713*R-0.28886*G+0.436*B+128;
channelsYUV420_YUV[2].at<uchar>(i,j)=0.615*R-0.51499*G-0.10001*B+128;
}
}
///Архивирование
imageYUV420_Y=channelsYUV420_YUV[0];
for( int i = 0; i < imageINPUT.rows; i++ )
{
for( int j = 0; j < imageINPUT.cols; j+=2 )
{
int Uthis=channelsYUV420_YUV[1].at<uchar>(i,j);
int Uright=channelsYUV420_YUV[1].at<uchar>(i,j+1);
int Vthis=channelsYUV420_YUV[2].at<uchar>(i,j);
int Vright=channelsYUV420_YUV[2].at<uchar>(i,j+1);
channelsYUV420_UV[0].at<uchar>(i,j/2)=(Uthis+Uright)/2;
channelsYUV420_UV[1].at<uchar>(i,j/2)=(Vthis+Vright)/2;
}
}
if (CheckBox1->GetValue()==true)
{
cvNamedWindow("Y", CV_WINDOW_AUTOSIZE);
cv::imshow("Y", imageYUV420_Y);
cvNamedWindow("U", CV_WINDOW_AUTOSIZE);
cv::imshow("U", channelsYUV420_UV[0]);
cvNamedWindow("V", CV_WINDOW_AUTOSIZE);
cv::imshow("V", channelsYUV420_UV[1]);
}
cv::merge(channelsYUV420_YUV,imageYUV420_YUV);
cv::resize(imageYUV420_YUV, imageYUV420_YUV, cv::Size(SIZE_IMAGE, SIZE_IMAGE), 0.0, 0.0);
wxImage aswxImage2 = wxImage(imageYUV420_YUV.cols, imageYUV420_YUV.rows, imageYUV420_YUV.data, true);
wxBitmap bitmap2 = wxBitmap(aswxImage2);
StaticBitmap2->SetBitmap(bitmap2);
///А теперь нужно разархивировать изображение
for( int i = 0; i < imageOUTPUT.rows; i++ )
{
for( int j = 0; j < imageOUTPUT.cols; j++ )
{
int R = (float)imageYUV420_Y.at<uchar>(i,j) + 1.13983 * ((float)channelsYUV420_UV[1].at<uchar>(i,j/2)-128);
if (R>255) R=255; if (R<0) R=0;
int G = (float)imageYUV420_Y.at<uchar>(i,j) -0.39465 * ((float)channelsYUV420_UV[0].at<uchar>(i,j/2)-128) - 0.58060 * ((float)channelsYUV420_UV[1].at<uchar>(i,j/2)-128);
if (G>255) G=255; if (G<0) G=0;
int B = (float)imageYUV420_Y.at<uchar>(i,j) + 2.03211 * ((float)channelsYUV420_UV[0].at<uchar>(i,j/2)-128);
if (B>255) B=255;
if (B<0) B=0;
ChannelsInOutput[0].at<uchar>(i,j)=(uchar)R;
ChannelsInOutput[1].at<uchar>(i,j)=(uchar)G;
ChannelsInOutput[2].at<uchar>(i,j)=(uchar)B;
}
}
wxString mystring4 = wxString::Format(wxT("%d%s"), imageINPUT.channels()*imageINPUT.cols*imageINPUT.rows," байт");
StaticText4->SetLabelText(mystring4);
wxString mystring5 = wxString::Format(wxT("%d%s"), imageYUV420_Y.cols*imageYUV420_Y.rows+imageYUV420_UV.channels()*imageYUV420_UV.cols*imageYUV420_UV.rows," байт");
StaticText5->SetLabelText(mystring5);
wxString mystringR = wxString::Format(wxT("%f"), (float)(imageINPUT.channels()*imageINPUT.cols*imageINPUT.rows) / (float)(imageYUV420_Y.cols*imageYUV420_Y.rows+imageYUV420_UV.channels()*imageYUV420_UV.cols*imageYUV420_UV.rows) );
StaticTextRatio->SetLabelText(mystringR);
break;
}
case 0: ///RGB to YUV 4:4:4
{
cv::Mat imageYUV420_YUV = cvCreateMat( imageINPUT.rows, imageINPUT.cols, CV_8UC3 );
std::vector<cv::Mat> channelsYUV420_YUV;
cv::split(imageYUV420_YUV,channelsYUV420_YUV);
///Перевод в цветовую раскладку YUV
for( int i = 0; i < imageINPUT.rows; i++ )
{
for( int j = 0; j < imageINPUT.cols; j++ )
{
int R=ChannelsInInput[0].at<uchar>(i,j);
int G=ChannelsInInput[1].at<uchar>(i,j);
int B=ChannelsInInput[2].at<uchar>(i,j);
channelsYUV420_YUV[0].at<uchar>(i,j)=0.299*R+0.587*G+0.114*B;
channelsYUV420_YUV[1].at<uchar>(i,j)=-0.14713*R-0.28886*G+0.436*B+128;
channelsYUV420_YUV[2].at<uchar>(i,j)=0.615*R-0.51499*G-0.10001*B+128;
//channelsYUV420_YUV[1].at<uchar>(i,j)=-0.168736*R-0.331264*G+0.5*B+128;
//channelsYUV420_YUV[2].at<uchar>(i,j)=0.5*R-0.418688*G-0.081312*B+128;
}
}
///Архивирование
///А теперь нужно разархивировать изображение
for( int i = 0; i < imageOUTPUT.rows; i++ )
{
for( int j = 0; j < imageOUTPUT.cols; j++ )
{
int R = (float)channelsYUV420_YUV[0].at<uchar>(i,j) + 1.13983 * ((float)channelsYUV420_YUV[2].at<uchar>(i,j)-128);
//int R = (float)channelsYUV420_YUV[0].at<uchar>(i,j) + 1.402 * ((float)channelsYUV420_YUV[2].at<uchar>(i,j)-128);
if (R>255) R=255;
if (R<0) R=0;
int G = (float)channelsYUV420_YUV[0].at<uchar>(i,j) -0.39465 * ((float)channelsYUV420_YUV[1].at<uchar>(i,j)-128) - 0.58060 * ((float)channelsYUV420_YUV[2].at<uchar>(i,j)-128);
//int G = (float)channelsYUV420_YUV[0].at<uchar>(i,j) -0.34414 * ((float)channelsYUV420_YUV[1].at<uchar>(i,j)-128) - 0.71414 * ((float)channelsYUV420_YUV[2].at<uchar>(i,j)-128);
if (G>255) G=255;
if (G<0) G=0;















