SEHException when I want to merge channels in OpenCV

asked 2015-02-05 21:34:43 -0500

nob_forward gravatar image

updated 2015-02-06 01:16:50 -0500

berak gravatar image

This is code:

 int l = label1->Text->Length;
                 int* codes = new int[l];
                 for (int i = 0; i <l; i++)
                 {
                     int a = label1->Text[i];
                     codes[i] = label1->Text[i];
                 }
                 System::String^ start = "p0ChAT0K";
                 System::String^ finish = "J93K@dfa";
                 System::String^ Result = label1->Text;
                 length = start->Length + finish->Length + Result->Length;
                 bool* Cypher = new bool[length * 8];//зашифрованный текст в бинарном виде
                 if (radioButton2->Checked)
                 {
                     Cypher = ModVisioner(codes, start, finish, l);
                 }
                 int textsize = length * 8;
                 int contsize = 3 * widt*heigh;
                 if (textsize * 2<contsize)//внедрение в каждый второй младший бит
                 {
                     label2->Text = "Good Image";
                 }
                 else
                 {
                     label2->Text = "Bad Image";
                 }

                 vector<int>Cv;
                 for (int m = 0; m < 3; m++)
                 {


                     for (int i = 0; i < widt; i++)
                     {

                         for (int j = 0; j < heigh; j++)
                         {
                             uchar temp1 = Matvector[2 - m].at<uchar>(j, i);
                             Cv.push_back(temp1);


                         }
                     }
                 }

                 vector<int>Sv;//вектор изображения с ЦВЗ
                 vector< bool*>v;
                 for (int m = 0; m < length; m++)//текст в двоичной форме
                 {
                     bool* b = new bool[8];
                     for (int i = 0; i<8; i++)
                     {
                         b[i] = Cypher[m * 8 + i];
                     }
                     v.push_back(b);
                     delete b;
                 }


                 for (int i = 0; i < contsize; i++)
                 {

                     bool* P = new bool[8];//замена младшего бита
                     P = Decimal2Binary(Cv[i]);
                     if ((i % 2 == 0) && (i<length * 2))
                     {
                         int k = i / 16;
                         int l = (i % 16) / 2;
                         P[7] = v[k][l];


                     }
                     else
                     {
                         P[7] = rand() % 2;
                     }
                     Sv.push_back(Binary2Decimal(P));
                     delete P;
                 }


                 Mat Vector1 = cvCreateMat(heigh, widt, CV_8UC1);
                 Mat Vector2 = cvCreateMat(heigh, widt, CV_8UC1);
                 Mat Vector3 = cvCreateMat(heigh, widt, CV_8UC1);
                 vector<Mat> Vector;
                 Vector.push_back(Vector1);
                 Vector.push_back(Vector2);
                 Vector.push_back(Vector3);
                 for (int m = 0; m < 3; m++)
                 {
                     for (int i = 0; i < widt; i++)
                     {

                         for (int j = 0; j < heigh; j++)
                         {
                             Vector[2 - m].at<uchar>(j, i) = Sv[i*heigh + j];



                         }
                     }

                 }

                 Mat FResult = cvCreateMat(heigh, widt, CV_8UC1);
                 merge(Vector, FResult);//error here
                 imwrite("merged.jpg", FResult);
                 return FResult;

It is a code of steganoalgorithm LSB in OpenCV. before merging channels it works well. Please,help me and tell me why this exception is happens.

edit retag flag offensive close merge delete

Comments

2

"before merging channels it works well." - i kinda doubt that.

  • since you're new to this: avoid mixing opencv and managed c++, winforms. you can live without a textbox.
  • do not use cvCreateMat or the like. cv::Mat has its own constructors, mixing in deprecated c-api functionality is the straight way to hell
  • you cannot delete the items, you push into your vector<bool*>, and expect them to be valid later
berak gravatar imageberak ( 2015-02-06 01:32:25 -0500 )edit