Перейти к содержимому
Compvision.ru

Tur

Пользователи
  • Количество публикаций

    18
  • Зарегистрирован

  • Посещение

Репутация

0 Новичек

О Tur

  • Звание
    Бывалый
  1. Ошибка найдена, надо было добавить & void ishowM(CMatrix&); IplImage* mat2gray(CMatrix&); в классе CMatrix не был прописан копиконструктор
  2. Smorodov, спасибо за предыдущий ответ. Еще одна проблема с инклюдами вероятно. Возникает такая ошибка или Перешел на консоль и вот класс draw.h с одной функцией #pragma once #include <cv.h> #include <highgui.h> #include "cmatrix.h" using namespace cv; class draw // drawfuncs { public: void ishowM(CMatrix); }; Вот реализация draw.cpp #include "stdafx.h" #include "drawfuncs.h" IplImage* mat2gray(CMatrix M) { CvSize cs; cs.height = M.nRows; cs.width = M.nCols; IplImage *frame = cvCreateImage(cs, IPL_DEPTH_8U, 3); uchar tmp; short *temp = M[0]; for(int y=0; y < frame->height; y++) { uchar* data = (uchar*)(frame->imageData + y*frame->widthStep); for(int x=0; x < frame->width; x++) { tmp = (*temp++)/4; *data++ = tmp; *data++ = tmp; *data++ = tmp; } } return frame; } void draw::ishowM(CMatrix M) { IplImage* frame = mat2gray(M); cvShowImage("example", frame); cvWaitKey(1); cvReleaseImage(&frame); cvDestroyWindow("example"); } Если все закомментировать, оставить только IplImage *frame = cvCreateImage(cs, IPL_DEPTH_8U, 3);, то все равно ошибка сохраняется. Класс CMatrix очень простой, там ошибки нет. Она где то в инклюдах думаю. Может быть есть что сказать.
  3. Smorodov, спасибо! Продвинулся немного. Написал функцию, получающую R G B и выводящую картинку static void ishow3(String^ img_Name, RawData^ RD) { string imgName; MarshalString(img_Name, imgName); static string namewindow; if (imgName.compare(namewindow) != 0) // если функция получает старое имя окна, то оно вновь не создается, картинка выводится в старое окно { cvNamedWindow(imgName.c_str(), CV_WINDOW_AUTOSIZE); namewindow = imgName.c_str(); // как странно это работает! Разве стринги так копируются? } IplImage* frame = draw::get_colorimage(RD); cvShowImage(imgName.c_str(), frame); cvWaitKey(1); } static IplImage* get_colorimage(RawData^ RD) { int rows = RD->R->GetLength(0); int cols = RD->R->GetLength(1); IplImage *frame = cvCreateImage(cvSize(cols,rows),IPL_DEPTH_8U,3); for(int y=0; y < frame->height; y++) { uchar* data = (uchar*)(frame->imageData + y*frame->widthStep); for(int x=0; x < frame->width; x++) { *data++ = RD->B[y,x]/4; // делю на 4 т.к. мои данные 10-ти битные *data++ = RD->G[y,x]/4; // цепочка bgrbgrbgr.... *data++ = RD->R[y,x]/4; } } return frame; } Т.е. все почти так как и было у меня. Интересно что функция cvCreateImage может возвращать как IplImage* так и Mat. Как такое возможно? Оказывается что в дебагере нельзя увидеть значение namewindow. Почему бы это? Если static, то нельзя? Мои окна перекрывают друг друга. Как задать координаты окна (Left, Top) в которое выводится картинка?
  4. Да лишнее, но у меня как бы два потока фреймов и каждый надо выводить в свое окно поочередно, т.е. фрейм из потока 1 в окно 1, затем фрейм из потока 2 в окно 2, затем опять фрейм из потока 1 в окно 1 и т.д. в этом проблема. Мне надо как то зафиксировать окно, напр, обращаться к нему по имени. Как наполнить структуру IplImage данными матриц R G B? Наподобие того как я заполняю cv::Mat for (int i=0; i<rows; i++) { uchar* data = c_image.ptr<uchar>(i); for (int j=0; j<cols; j++) { *data++ = B[i,j]/4; *data++ = G[i,j]/4; *data++ = R[i,j]/4; } } Спасибо за ссылку по конвертации стрингов.
  5. Smorodov, застрял я совершенно. Получил из файла три матрицы R G B. Вывожу их так: static void ishoW3(array<int, 2>^ R, array<int, 2>^ G, array<int, 2>^ B ) { static cv::String imgName = "Color Image "; static char c = '0'; imgName.clear(); int rows = R->GetLength(0); int cols = R->GetLength(1); CvSize cs; cs.height = rows; cs.width = cols; cv::Mat c_image; //c_image.release(); c_image = cvCreateImage(cs,IPL_DEPTH_8U,3); for (int i=0; i<rows; i++) { uchar* data = c_image.ptr<uchar>(i); for (int j=0; j<cols; j++) { *data++ = B[i,j]/4; *data++ = G[i,j]/4; *data++ = R[i,j]/4; } } if(!c_image.empty()) { cv::namedWindow(imgName); cv::imshow(imgName, c_image); cv::waitKey(1); } } Все вроде бы нормально, но не могу вывести другие R G B матрицы в новое окно. Надо сменить имя окна, но не знаю как передать функции имя окна, String^ не конвертируется в static cv::String. Пытался вывести картинку через структуру IplImage, но не понимаю как в нее загрузить мои матрицы R G B. Подскажите пожалуйста как это сделать? Мне нужно создать два окна и в каждое из них выводить свое изображение из своих матриц R G B.
×