Jump to content
Compvision.ru
virt

Вывод видео на форму в visual studio 2008 - 2010

Recommended Posts

Есть предположение что Bitmap не создается.

Подробнее не подскажу .NET не моё.

ЗЫ: Посмотрите пост №65

там есть строчка:


this->pictureBox1->Image = gcnew Bitmap(frame.cols, frame.rows, frame.step, PixelFormat::Format24bppRgb, IntPtr(frame.data));
[/code]

Смысл вроде тот-же но она отличается от Вашей (хотя здесь работа с cv::Mat).

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Я с cli не работаю (только если очень надо :) ), но вроде проблемы с конвертацией быть не должно:

Тут все написано.

ЗЫ: создавать окно каждый кадр - это лишнее.

Share this post


Link to post
Share on other sites

Да лишнее, но у меня как бы два потока фреймов и каждый надо выводить в свое окно поочередно, т.е. фрейм из потока 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;

     }

}

Спасибо за ссылку по конвертации стрингов.

Share this post


Link to post
Share on other sites

Установка байтов красного слоя в 255. Взял отсюда: http://stackoverflow.com/questions/6899218/writing-to-iplimage-imagedata

int main (int argc, const char * argv[]) {

IplImage *frame = cvCreateImage(cvSize(41, 41), IPL_DEPTH_8U, 3);

for( int y=0; y<frame->height; y++ ) {
uchar* ptr = (uchar*) ( frame->imageData + y * frame->widthStep );
for( int x=0; x<frame->width; x++ ) {
ptr[3*x+2] = 255; //Set red to max (BGR format)
}
}

cvNamedWindow("window", CV_WINDOW_AUTOSIZE);
cvShowImage("window", frame);
cvWaitKey(0);
cvReleaseImage(&frame);
cvDestroyWindow("window");
return 0;
}[/code]

Share this post


Link to post
Share on other sites

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) в которое выводится картинка?

Share this post


Link to post
Share on other sites
Интересно что функция cvCreateImage может возвращать как IplImage* так и Mat. Как такое возможно?

Просто определено преобразование IplImage* в Mat.

Оказывается что в дебагере нельзя увидеть значение namewindow. Почему бы это? Если static, то нельзя?

Не помню чтобы сталкивался с таким, поэтому хз.

Можно просто выводить его в консоль.

Ставим точку останова, что последнее напечатано в консоли, значит оно и есть.

Как задать координаты окна (Left, Top) в которое выводится картинка?

cvMoveWindow("win_name", x, y);

Share this post


Link to post
Share on other sites

Smorodov, спасибо за предыдущий ответ. Еще одна проблема с инклюдами вероятно.

Возникает такая ошибка

74a3b667ac24.png

или

1d0e1ec47e22.png

Перешел на консоль и вот класс 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 очень простой, там ошибки нет. Она где то в инклюдах думаю. Может быть есть что сказать.

Share this post


Link to post
Share on other sites

Ошибка найдена, надо было добавить &

void ishowM(CMatrix&);

IplImage* mat2gray(CMatrix&);

в классе CMatrix не был прописан копиконструктор

Share this post


Link to post
Share on other sites

У меня вообщем такая беда. Работаю с Windows Form, делаю отображение видео на форму, все отображается, но при попытке использовать cvReleaseImage выбивает ошибку:

error C2664: cvReleaseCapture: невозможно преобразовать параметр 1 из "cli::interior_ptr<Type>" в "CvCapture **"

1> with

1> [

1> Type=CvCapture *

1> ]

1> Нельзя преобразовать управляемый тип в неуправляемый тип

Как можно от неё избавится?

Share this post


Link to post
Share on other sites

С этим разобрался, спасибо за ссылку. Теперь новая проблема. При включении видео, процесс проекта начинает жестко забивать оперативную память и даже после его прерывания память остаётся забитой. Почему так и как можно исправить??

Share this post


Link to post
Share on other sites

Всем привет!

Использую связку qt + vs2010 + QT

Вывожу видео с камеры кинекта на форму(испольую таймер) и имею след. проблему:

Видео на форме играется только тогда, когда оно параллельно выводится в окно opencv, если его не выводить cv::imshow("dd", view); то программа просто зависает

причем не ему все равно что выводить, например на форме rgb, то в окошко можно вывести хоть карту глубины.

В прошлой программе я выводил на форму 4 видео, три из них работали нормально, а четвертому тоже необхожимо было вводить еще и в окно , иначе на форме не показывало ничего.

Ваши идеи, в чем проблема?

Я предполагаю что что то с таймером, но черт его знает


if (capture.isOpened()==true)

		{

			capture.grab();

			capture.retrieve( depth_mat, CV_CAP_OPENNI_DEPTH_MAP );

			capture.retrieve( bgr_mat, CV_CAP_OPENNI_BGR_IMAGE);

			capture.retrieve(world, CV_CAP_OPENNI_POINT_CLOUD_MAP);

			double min_val, max_val;

			cv::minMaxIdx(depth_mat, &min_val, &max_val);

			double scale=255/max_val;

			depth_mat*=scale;

			view=depth_mat;	



                        cv::imshow("dd", view);


		}

    key=cv::waitKey(50);

	}

	capture.release();



или imshow прерывает цикл как то? или из за key=cv::waitKey(50), вообщем не знаю

Share this post


Link to post
Share on other sites

Здравствуйте. Использую Visual Studio 12 и openCV 2.7. Консольное приложение компилируется и запускается без проблем, работает как надо. Но в приложении windows forms всё время обнаруживаются какие нибудь ошибки при компиляции, скачивал из этой темы приложение VideoOnForm, оно тоже не работает.

Вот такие ошибки:

MyForm.obj : warning LNK4248: эхЁрчЁх°хээр  ыхъёхьр TypeRef (0100003B) фы  "CvCapture"; юсЁрч эхы№ч  чряєёЄшЄ№

1>1.obj : warning LNK4248: эхЁрчЁх°хээр  ыхъёхьр TypeRef (01000048) фы  "CvCapture"; юсЁрч эхы№ч  чряєёЄшЄ№

1>MyForm.obj : error LNK2028: ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A00093F) "extern "C" struct _IplImage * __cdecl cvQueryFrame(struct CvCapture *)" (?cvQueryFrame@@$$J0YAPAU_IplImage@@PAUCvCapture@@@Z) т ЇєэъЎшш "private: void __clrcall My1::MyForm::timer1_Tick(class System::Object ^,class System::EventArgs ^)" (?timer1_Tick@MyForm@My1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>1.obj : error LNK2028: ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A000952) "extern "C" struct _IplImage * __cdecl cvQueryFrame(struct CvCapture *)" (?cvQueryFrame@@$$J0YAPAU_IplImage@@PAUCvCapture@@@Z) т ЇєэъЎшш "private: void __clrcall My1::MyForm::timer1_Tick(class System::Object ^,class System::EventArgs ^)" (?timer1_Tick@MyForm@My1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>MyForm.obj : error LNK2028: ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A000942) "extern "C" struct CvCapture * __cdecl cvCreateFileCapture(char const *)" (?cvCreateFileCapture@@$$J0YAPAUCvCapture@@PBD@Z) т ЇєэъЎшш "private: void __clrcall My1::MyForm::button2_Click(class System::Object ^,class System::EventArgs ^)" (?button2_Click@MyForm@My1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>1.obj : error LNK2028: ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A000955) "extern "C" struct CvCapture * __cdecl cvCreateFileCapture(char const *)" (?cvCreateFileCapture@@$$J0YAPAUCvCapture@@PBD@Z) т ЇєэъЎшш "private: void __clrcall My1::MyForm::button2_Click(class System::Object ^,class System::EventArgs ^)" (?button2_Click@MyForm@My1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>MyForm.obj : error LNK2020: эхЁрчЁх°хээр  ыхъёхьр (0A0009BF) "public: void __thiscall cv::Mat::copySize(class cv::Mat const &)" (?copySize@Mat@cv@@$$FQAEXABV12@@Z)

1>1.obj : error LNK2028: ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A0009D2) "public: void __thiscall cv::Mat::copySize(class cv::Mat const &)" (?copySize@Mat@cv@@$$FQAEXABV12@@Z) т ЇєэъЎшш "public: __thiscall cv::Mat::Mat(class cv::Mat const &)" (??0Mat@cv@@$$FQAE@ABV01@@Z)

1>MyForm.obj : error LNK2028: ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A0009C0) "int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@$$FYAHPAHH@Z) т ЇєэъЎшш "public: void __thiscall cv::SparseMat::addref(void)" (?addref@SparseMat@cv@@$$FQAEXXZ)

1>1.obj : error LNK2028: ёё√ыър эр эхЁрчЁх°хээє■ ыхъёхьє (0A0009D3) "int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@$$FYAHPAHH@Z) т ЇєэъЎшш "public: void __thiscall cv::SparseMat::addref(void)" (?addref@SparseMat@cv@@$$FQAEXXZ)

1>1.obj : error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы "int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@$$FYAHPAHH@Z) т ЇєэъЎшш "public: void __thiscall cv::SparseMat::addref(void)" (?addref@SparseMat@cv@@$$FQAEXXZ)

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@$$FYAHPAHH@Z)"

1>1.obj : error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы "extern "C" struct CvCapture * __cdecl cvCreateFileCapture(char const *)" (?cvCreateFileCapture@@$$J0YAPAUCvCapture@@PBD@Z) т ЇєэъЎшш "private: void __clrcall My1::MyForm::button2_Click(class System::Object ^,class System::EventArgs ^)" (?button2_Click@MyForm@My1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""extern "C" struct CvCapture * __cdecl cvCreateFileCapture(char const *)" (?cvCreateFileCapture@@$$J0YAPAUCvCapture@@PBD@Z)"

1>1.obj : error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы "extern "C" struct _IplImage * __cdecl cvQueryFrame(struct CvCapture *)" (?cvQueryFrame@@$$J0YAPAU_IplImage@@PAUCvCapture@@@Z) т ЇєэъЎшш "private: void __clrcall My1::MyForm::timer1_Tick(class System::Object ^,class System::EventArgs ^)" (?timer1_Tick@MyForm@My1@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z)

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""extern "C" struct _IplImage * __cdecl cvQueryFrame(struct CvCapture *)" (?cvQueryFrame@@$$J0YAPAU_IplImage@@PAUCvCapture@@@Z)"

1>1.obj : error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы "public: void __thiscall cv::Mat::copySize(class cv::Mat const &)" (?copySize@Mat@cv@@$$FQAEXABV12@@Z) т ЇєэъЎшш "public: __thiscall cv::Mat::Mat(class cv::Mat const &)" (??0Mat@cv@@$$FQAE@ABV01@@Z)

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: void __thiscall cv::Mat::copySize(class cv::Mat const &)" (?copySize@Mat@cv@@$$FQAEXABV12@@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::setSVMDetector(class cv::_InputArray const &)" (?setSVMDetector@HOGDescriptor@cv@@UAEXABV_InputArray@2@@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::setSVMDetector(class cv::_InputArray const &)" (?setSVMDetector@HOGDescriptor@cv@@UAEXABV_InputArray@2@@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual bool __thiscall cv::HOGDescriptor::read(class cv::FileNode &)" (?read@HOGDescriptor@cv@@UAE_NAAVFileNode@2@@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual bool __thiscall cv::HOGDescriptor::read(class cv::FileNode &)" (?read@HOGDescriptor@cv@@UAE_NAAVFileNode@2@@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::write(class cv::FileStorage &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)const " (?write@HOGDescriptor@cv@@UBEXAAVFileStorage@2@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::write(class cv::FileStorage &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)const " (?write@HOGDescriptor@cv@@UBEXAAVFileStorage@2@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual bool __thiscall cv::HOGDescriptor::load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?load@HOGDescriptor@cv@@UAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual bool __thiscall cv::HOGDescriptor::load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?load@HOGDescriptor@cv@@UAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::save(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)const " (?save@HOGDescriptor@cv@@UBEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::save(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)const " (?save@HOGDescriptor@cv@@UBEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::copyTo(struct cv::HOGDescriptor &)const " (?copyTo@HOGDescriptor@cv@@UBEXAAU12@@Z)"

1>MyForm.obj : error LNK2019: ёё√ыър эр эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы "public: virtual void __thiscall cv::HOGDescriptor::copyTo(struct cv::HOGDescriptor &)const " (?copyTo@HOGDescriptor@cv@@UBEXAAU12@@Z) т ЇєэъЎшш "[T2M] public: __thiscall std::move_iterator<class std::_Vector_iterator<class std::_Vector_val<struct std::_Simple_types<unsigned int> > > >::move_iterator<class std::_Vector_iterator<class std::_Vector_val<struct std::_Simple_types<unsigned int> > > >(class std::move_iterator<class std::_Vector_iterator<class std::_Vector_val<struct std::_Simple_types<unsigned int> > > > const &)" (__t2m@??0?$move_iterator@V?$_Vector_iterator@V?$_Vector_val@U?$_Simple_types@I@std@@@std@@@std@@@std@@QAE@ABV01@@Z)

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::compute(class cv::Mat const &,class std::vector<float,class std::allocator<float> > &,class cv::Size_<int>,class cv::Size_<int>,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > const &)const " (?compute@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@MV?$allocator@M@std@@@std@@V?$Size_@H@2@2ABV?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@5@@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::compute(class cv::Mat const &,class std::vector<float,class std::allocator<float> > &,class cv::Size_<int>,class cv::Size_<int>,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > const &)const " (?compute@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@MV?$allocator@M@std@@@std@@V?$Size_@H@2@2ABV?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@5@@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detect(class cv::Mat const &,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > &,double,class cv::Size_<int>,class cv::Size_<int>,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > const &)const " (?detect@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@std@@NV?$Size_@H@2@2ABV45@@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detect(class cv::Mat const &,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > &,double,class cv::Size_<int>,class cv::Size_<int>,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > const &)const " (?detect@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@std@@NV?$Size_@H@2@2ABV45@@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detect(class cv::Mat const &,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > &,class std::vector<double,class std::allocator<double> > &,double,class cv::Size_<int>,class cv::Size_<int>,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > const &)const " (?detect@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@std@@AAV?$vector@NV?$allocator@N@std@@@5@NV?$Size_@H@2@3ABV45@@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detect(class cv::Mat const &,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > &,class std::vector<double,class std::allocator<double> > &,double,class cv::Size_<int>,class cv::Size_<int>,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > const &)const " (?detect@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@std@@AAV?$vector@NV?$allocator@N@std@@@5@NV?$Size_@H@2@3ABV45@@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detectMultiScale(class cv::Mat const &,class std::vector<class cv::Rect_<int>,class std::allocator<class cv::Rect_<int> > > &,double,class cv::Size_<int>,class cv::Size_<int>,double,double,bool)const " (?detectMultiScale@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Rect_@H@cv@@V?$allocator@V?$Rect_@H@cv@@@std@@@std@@NV?$Size_@H@2@2NN_N@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detectMultiScale(class cv::Mat const &,class std::vector<class cv::Rect_<int>,class std::allocator<class cv::Rect_<int> > > &,double,class cv::Size_<int>,class cv::Size_<int>,double,double,bool)const " (?detectMultiScale@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Rect_@H@cv@@V?$allocator@V?$Rect_@H@cv@@@std@@@std@@NV?$Size_@H@2@2NN_N@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detectMultiScale(class cv::Mat const &,class std::vector<class cv::Rect_<int>,class std::allocator<class cv::Rect_<int> > > &,class std::vector<double,class std::allocator<double> > &,double,class cv::Size_<int>,class cv::Size_<int>,double,double,bool)const " (?detectMultiScale@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Rect_@H@cv@@V?$allocator@V?$Rect_@H@cv@@@std@@@std@@AAV?$vector@NV?$allocator@N@std@@@5@NV?$Size_@H@2@3NN_N@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::detectMultiScale(class cv::Mat const &,class std::vector<class cv::Rect_<int>,class std::allocator<class cv::Rect_<int> > > &,class std::vector<double,class std::allocator<double> > &,double,class cv::Size_<int>,class cv::Size_<int>,double,double,bool)const " (?detectMultiScale@HOGDescriptor@cv@@UBEXABVMat@2@AAV?$vector@V?$Rect_@H@cv@@V?$allocator@V?$Rect_@H@cv@@@std@@@std@@AAV?$vector@NV?$allocator@N@std@@@5@NV?$Size_@H@2@3NN_N@Z)"

1>1.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::computeGradient(class cv::Mat const &,class cv::Mat &,class cv::Mat &,class cv::Size_<int>,class cv::Size_<int>)const " (?computeGradient@HOGDescriptor@cv@@UBEXABVMat@2@AAV32@1V?$Size_@H@2@2@Z)"

1>MyForm.obj : error LNK2001: эхЁрчЁх°хээ√щ тэх°эшщ ёшьтюы ""public: virtual void __thiscall cv::HOGDescriptor::computeGradient(class cv::Mat const &,class cv::Mat &,class cv::Mat &,class cv::Size_<int>,class cv::Size_<int>)const " (?computeGradient@HOGDescriptor@cv@@UBEXABVMat@2@AAV32@1V?$Size_@H@2@2@Z)"

1>C:\Users\┼тухэшщ\Desktop\╧ЁюхъЄ√ C++\╧ЁюхъЄ√ яю OpenCV\├ЁрЇшўхёъшщ шэЄхЁЇхщё\1\Debug\1.exe : fatal error LNK1120: эхЁрчЁх°хээ√ї тэх°эшї ¤ыхьхэЄют: 24

========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Share this post


Link to post
Share on other sites

ошибки линковки, скорее всего что то с библиотеками(старые или не подключены).

и да используйте английскую версию вижуал студии.

Share this post


Link to post
Share on other sites

Обещанная статейка: attachicon.gifOpencv23Vs2010.pdf

 

Visual Studio 2013

OpenCV+MFC. Пытаюсь отладить программу (написана согласно методичке).

При отладке ругается:

 

2    IntelliSense: Предупреждение PCH:     d:\VISUAL STUDIO PROJECT\CVPROF\CVPROFDlg.cpp    1    1    CVPROF

1    error C4703: используется потенциально неинициализированная локальная переменная-указатель "App"    d:\visual studio project\cvprof\cvprofdlg.cpp    251    1    CVPROF

 

Код приведен ниже...

 

// CVPROFDlg.cpp : файл реализации
//

#include "stdafx.h"
#include "CVPROF.h"
#include "CVPROFDlg.h"
#include "afxdialogex.h"
#include "opencv2/opencv.hpp"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define WIDTHBYTES(bits) ((((bits) + 31) / 32) * 4)
CStatic m_cap;
CvCapture*capture;
IplImage*frame;
CDC*cap_dc;
DWORD WINAPI InstanceThread(LPVOID);
DWORD dwThreadId = 0;
HANDLE hThread = NULL;
HBITMAP CreateRGBBitmap(IplImage* _Grab);
// Диалоговое окно CAboutDlg используется для описания сведений о приложении

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// Данные диалогового окна
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // поддержка DDX/DDV

// Реализация
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// диалоговое окно CCVPROFDlg



CCVPROFDlg::CCVPROFDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CCVPROFDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCVPROFDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_CAP_STATIC, m_cap);
}

BEGIN_MESSAGE_MAP(CCVPROFDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDOK, &CCVPROFDlg::OnBnClickedOk)
	ON_WM_CLOSE()
END_MESSAGE_MAP()


// обработчики сообщений CCVPROFDlg

BOOL CCVPROFDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// Добавление пункта "О программе..." в системное меню.

	// IDM_ABOUTBOX должен быть в пределах системной команды.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Задает значок для этого диалогового окна.  Среда делает это автоматически,
	//  если главное окно приложения не является диалоговым
	SetIcon(m_hIcon, TRUE);			// Крупный значок
	SetIcon(m_hIcon, FALSE);		// Мелкий значок

	// TODO: добавьте дополнительную инициализацию

	return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления

	cap_dc = m_cap.GetDC();
	capture = cvCreateCameraCapture(CV_CAP_ANY);
	hThread = CreateThread(
		NULL, 
		0, 
		InstanceThread, 
		0, 
		0, 
		&dwThreadId); 
	assert(capture);
}

void CCVPROFDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным ниже кодом,
//  чтобы нарисовать значок.  Для приложений MFC, использующих модель документов или представлений,
//  это автоматически выполняется рабочей областью.

void CCVPROFDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // контекст устройства для рисования

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Выравнивание значка по центру клиентского прямоугольника
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Нарисуйте значок
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

// Система вызывает эту функцию для получения отображения курсора при перемещении
//  свернутого окна.
HCURSOR CCVPROFDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CCVPROFDlg::OnBnClickedOk()
{
	// TODO: добавьте свой код обработчика уведомлений
	CDialogEx::OnOK();
}


void CCVPROFDlg::OnClose()
{
	CloseHandle(hThread);
	cvReleaseCapture(&capture);
	ReleaseDC(cap_dc);
	CDialogEx:: OnClose();
}

//---------------------------------------------------------------------------
HBITMAP CreateRGBBitmap(IplImage* _Grab)
{
	char *App;
	IplImage *_Grab3 = 0, *_Grabf = 0;

	LPBITMAPINFO lpbi = new BITMAPINFO;

	lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	lpbi->bmiHeader.biWidth = _Grab->width;
	lpbi->bmiHeader.biHeight = _Grab->height;
	lpbi->bmiHeader.biPlanes = 1;
	lpbi->bmiHeader.biBitCount = 24;
	lpbi->bmiHeader.biCompression = BI_RGB;
	lpbi->bmiHeader.biSizeImage = WIDTHBYTES((DWORD)_Grab->width * 8) * _Grab->height;
	lpbi->bmiHeader.biXPelsPerMeter = 0;
	lpbi->bmiHeader.biYPelsPerMeter = 0;
	lpbi->bmiHeader.biClrUsed = 0;
	lpbi->bmiHeader.biClrImportant = 0;

	void *pBits;
	HBITMAP hBitmap = CreateDIBSection(NULL, lpbi, DIB_RGB_COLORS,
		(void **)&pBits, NULL, 0);
	delete lpbi;

	if (hBitmap)App = (char*)pBits;

	if (_Grab->depth != IPL_DEPTH_8U)
	{
		_Grabf = cvCloneImage(_Grab);
		if (_Grab)
		{
			cvReleaseImage(&_Grab);
		}
		_Grab = cvCreateImage(cvSize(_Grabf->width, _Grabf->height), IPL_DEPTH_8U, _Grabf->nChannels);
		cvConvert(_Grabf, _Grab);
		if (_Grabf)
		{
			cvReleaseImage(&_Grabf);
		}
	}

	if (_Grab->nChannels == 1)
	{
		_Grab3 = cvCreateImage(cvSize(_Grab->width, _Grab->height), IPL_DEPTH_8U, 3);
		cvMerge(_Grab, _Grab, _Grab, NULL, _Grab3);
	}

	if (_Grab->nChannels == 3)
	{
		_Grab3 = _Grab;
	}

	unsigned char *data;
	cvGetRawData(_Grab3, (uchar**)&data);

	if (_Grab3)
	{
		for (int i = 0; i < _Grab->height; i++)
		{
			memcpy(App + _Grab3->widthStep*(_Grab3->height - i - 1), data + _Grab3->widthStep*i, _Grab3->width * 3);
		}
	}

	if (_Grab->nChannels == 1)
	{
		cvReleaseImage(&_Grab3);
	}

	return hBitmap;
}
//----------------------------------------------------------------------------------
void DrawData(IplImage*_frame, CDC*dc)
{
	RECT r;
	dc->GetClipBox(&r);
	int width = r.right-r.left;
	int height = r.bottom-r.top;
	IplImage *img = cvCreateImage(cvSize(width, height), _frame->depth, _frame->nChannels);
	cvResize(_frame, img);
	HBITMAP pBitmap;
	pBitmap = CreateRGBBitmap(img);
	HDC hMemDC = CreateCompatibleDC(dc->m_hDC);
	HGDIOBJ hOldBm = SelectObject(hMemDC, pBitmap);
	BitBlt(dc->m_hDC, 0, 0, width, height, hMemDC, 0, 0, SRCCOPY);
	SelectObject(hMemDC, hOldBm);
	DeleteDC(hMemDC);
	DeleteObject(pBitmap);
	cvReleaseImage(&img);
}

Share this post


Link to post
Share on other sites

Думаю это решается путем инициализации App. Присвойте App=NULL при объявлении.

Share this post


Link to post
Share on other sites

Думаю это решается путем инициализации App. Присвойте App=NULL при объявлении.

 

Да, инициализировал. Помогло. Нашел еще пару ошибок. Получилось все как в методичке.

Удалось собрать проект. Но при запуске .exe возникли проблемы:

 

1. При запуске открывается форма. Загорается светодиод камеры (т.е. подключение к камере осуществляется), но при этом на форме лишь серый прямоугольник. После нескольких секунд появляется сообщение (см.рис.1).

 

post-1271-0-53004500-1427141214_thumb.jp

 

Закрываю программу.

 

2. Когда пытаюсь запустить снова, появляется окно выбора камеры (см.рис.2).

 

post-1271-0-62671600-1427141220_thumb.jp

 

Выбираю камеру. Жму ОК.

 

3. Тут же прилетает ошибка (см.рис.3)

 

post-1271-0-91757500-1427141225_thumb.jp

 

Строка 289 на которую ссылается окно с ошибкой в следующем участке кода:

BOOL CCVPROFDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// Добавление пункта "О программе..." в системное меню.

	// IDM_ABOUTBOX должен быть в пределах системной команды.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Задает значок для этого диалогового окна.  Среда делает это автоматически,
	//  если главное окно приложения не является диалоговым
	SetIcon(m_hIcon, TRUE);			// Крупный значок
	SetIcon(m_hIcon, FALSE);		// Мелкий значок

	// Чтобы каждый раз не обращаться
	// Освобождаемся в функции закрытия формы	

	cap_dc = m_cap.GetDC();
	capture = cvCaptureFromCAM(0);
	
	// Создаем поток захвата видео
	hThread = CreateThread(
		NULL,
		0,
		InstanceThread,
		0,
		0,
		&dwThreadId); 
	assert(capture);

	return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления
}

т.е. проблема в assert(capture); Что это может быть?

Share this post


Link to post
Share on other sites

Видимо камера не открылась, или assert сработал не как задумано автором. 

Попробуйте закомментировать assert.

Share this post


Link to post
Share on other sites

Видимо камера не открылась, или assert сработал не как задумано автором. 

Попробуйте закомментировать assert.

 

Закоментировал. Ошибка со ссылкой на assert пропала. Теперь просто программа запускается и сразу появляется окно Windows "Прекращена работа программы"...Камера молчит...

Share this post


Link to post
Share on other sites

Есть подозрение что камера не поддерживается. 

Попробуйте считать изображение из файла и вывести его.

Share this post


Link to post
Share on other sites

Есть подозрение что камера не поддерживается. 

Попробуйте считать изображение из файла и вывести его.

 

Как ни странно да. Хотя при создании консольного проложения с той-же opencv3.0 эта usb-камера открывалась. Подцепил другую - видит!

Но при этом появилось две странности.

 

Первая:работает программа и на форме формируется картинка, далее я открываю какое-нибуть окно, программу или диспетчер задач, как программа моя перестает работать и выводится ошибка:

 

post-1271-0-89187300-1427227531_thumb.jp

 

Вторая ерунда:при закрытии программы вылетает ошибка:

 

post-1271-0-62758500-1427227526_thumb.jp

 

В компиляторе при отладке (после ошибки при закрытии программы) пишет:

 

Поток 0xd38 завершился с кодом 0 (0x0).

Программа "[1540] CVPROF.exe" завершилась с кодом 2 (0x2).

 

Я почитал, народ пишет что такая ошибка может возникать если программу под пользователем с ограниченными правами запускаешь. ПРобовал под Администратором - таже петрушка.

 

Если начинаю отлаживать в целом весь проект, то выдает такое сообщение:

 

post-1271-0-19069900-1427228271_thumb.jp

 

Походу ругается на строку кода, где IPlImage....

Share this post


Link to post
Share on other sites

width и height проверьте, небось отрицательные или нулевые, или еще ерунда какая нибудь.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×