PDA

View Full Version : گرفتن فریم از کارت کپچر



hi level hdd
جمعه 17 اسفند 1386, 22:35 عصر
می خواستم بدونم چطور میشه تو سی شارپ از کپچر عکس

یا فریم گرفت خودم کارت کپچر رو شناختم و تصویر رو هم نشون دادم

ولی فریم رو نمیتونم بگیرم لطفا راهنمایی کنید . . .

someCoder
شنبه 18 اسفند 1386, 00:48 صبح
من با C کار میکردم و از openCV استفاده میکردم و خیلی راحت بود. (کلا با 3 خط برنامه!)
تو هم شاید بتونی با چیزی مثل opencvdotnet استفاده کنی.

hi level hdd
شنبه 18 اسفند 1386, 15:28 عصر
اگر منظورتون سی تحت داس هست اگر میشه کدی که نوشتید رو برام بفرستید

در ضمن ببخشید دیر جواب دادم آخه من تازه عضو شدم و بلد نیستم باز متشکرم

someCoder
شنبه 18 اسفند 1386, 15:54 عصر
C تحت داس که نیست! برنامه کنسول فکر کنم منظورت باشه!
به هر حال، این کد رو الان برات به عنوان نمونه نوشتم و تست هم کردم و بدون مشکل کار میکرد:

#include "cv.h"
#include "highgui.h"
#include <stdio.h>

int main(int argc, char** argv)
{
IplImage *frame = 0, *image = 0;
CvCapture* capture = 0;
capture = cvCaptureFromCAM(0);
if(!capture){
fprintf(stderr,"Could not initialize capturing...\n");
return -1;
}

cvNamedWindow("testOpenCV", 1);
frame = cvQueryFrame(capture);
if(!frame){
fprintf(stderr,"Could not capture any frame...\n");
return -1;
}
image = cvCreateImage(cvGetSize(frame), 8, 3);
image->origin = frame->origin;

while(frame && cvGetWindowHandle("testOpenCV")) {
cvCopy(frame, image); //don't change contents of frame!
cvShowImage("testOpenCV", image); //try using image instead

if(cvWaitKey(10)==27) break;
frame = cvQueryFrame(capture);
}
cvReleaseCapture(&capture);
cvDestroyWindow("testOpenCV");

return 0;
}

قسمتهای مهمش هم برات آبی کردم

hi level hdd
شنبه 18 اسفند 1386, 20:13 عصر
خیلی ممنون ولی این سه خطه ؟!؟!

someCoder
یک شنبه 19 اسفند 1386, 00:04 صبح
خیلی ممنون ولی این سه خطه ؟!؟!
اونی که من برات نوشتم، سعی کردم یه برنامه کاربردی کامل باشه و الا گرفتن فریم از کارت کپچر 3 خط نیست بلکه 2 خطه!

این کد گرفتن فریم از کپچر:

CvCapture* capture = cvCaptureFromCAM(0);
IplImage* frame = cvQueryFrame(capture);


نمایش دادنش 3 خطه:

cvNamedWindow("testOpenCV", 1);
cvShowImage("testOpenCV", frame);
cvWaitKey();

یعنی کد کاملش این میشه (2 خط گرفتن فریم، 3 خط نمایش):

#include "cv.h"
#include "highgui.h"
#include <stdio.h>

void main()
{
CvCapture* capture = cvCaptureFromCAM(0);
IplImage* frame = cvQueryFrame(capture);
cvNamedWindow("testOpenCV", 1);
cvShowImage("testOpenCV", frame);
cvWaitKey();
}

hi level hdd
یک شنبه 19 اسفند 1386, 14:35 عصر
باز هم سلام

من کدی که گفتید را در توربو سی کپی کردم ولی خیلی خطا دارد

برنامه openCV رو هم include , lib رو در lib , include سی کپی کردم ولی جواب نمیدهد

لطفا توضیح کامل دهید چون هیچی از openCV نمیدونم اگر ممکنه راه اندازی اولیه رو

توضیح دهید متشکرم

hi level hdd
یک شنبه 19 اسفند 1386, 14:38 عصر
من اصلا c++ بلد نیستم خواهش میکنم کدی که میفرستید سی باشه

البته سی رو تو کامپایلر سی پلاس مینویسم turbo c 3

hi level hdd
یک شنبه 19 اسفند 1386, 18:18 عصر
اگه ممکنه و زحمتی براتون نیست میشه تلفنی با هم صحبت کنیم تا همه سوالامو

بپرسم چون خیلی وقت برام تنگه و هیچی کار پردازش تصویر انجام ندادیم

someCoder
یک شنبه 19 اسفند 1386, 20:34 عصر
من اصلا توربو سی 3 رو کامپیوترم ندارم. اخوی سال 2008 هم مگه هنوز با توربو سی 3 برنامه پردازش تصویر مینویسن؟! اون IDE برای همون 17 سال پیش بود.

به هر حال، من خودم از Visual Studio 2008 استفاده میکنم و پیشنهاد میکنم تو هم از همین IDE استفاده کنی (البته اگر تو ویندوز میخوای کار کنی). برای تنظیمات لازم که بتونی برنامه هاتو کامپایل کنی، یه راهنما همراه با نصب OpenCV برات ایجاد میشه که میتونی از اون کمک بگیری. (در این مورد خاص تو فایل OpenCV/docs/faq.htm (http://opencvlibrary.sourceforge.net/faq#head-43d3a13c7d12482b34c54ad3c233226622a293f5) توضیح داده شده و خود من هم با استفاده از همون توضیحات تنظیمات لازم رو انجام میدم)

در مورد توربو سی همونطور که قبلا هم گفتم نمیتونم کمکت کنم ولی اگر خواستی از Visual Studio 2008 استفاده کنی، برات یه پروژه نمونه درست کردم و تنظیمات لازم هم انجام دادم و آماده کامپایل و اجراست. پروژه رو همینجا ضمیمه میکنم. (البته با فرض اینکه OpenCV رو در آدرس C:\Program Files\OpenCV نصب کرده باشی.)

بازم مشکلی داشتی همینجا بپرس. در خدمتم

hi level hdd
دوشنبه 20 اسفند 1386, 09:35 صبح
میشه همدیگر را ببینیم یا تلفنی صحبت کنیم تا درباره پردازش تصویر از شما کمک

بگیریم

باتشکر

someCoder
دوشنبه 20 اسفند 1386, 12:13 عصر
میشه همدیگر را ببینیم یا تلفنی صحبت کنیم تا درباره پردازش تصویر از شما کمک

بگیریم

باتشکر

راستش ترجیح میدم سوالات همینجا مطرح بشه. (دلایلش هم زیاده)
تو سوالاتت رو شروع کن. اگر به مشکل خاصی خوردی، تنها نمیذارمت. (لازم شد تلفنم رو هم میدم)

ضمنا ظاهرا این بحث به C کشیده شد بجای #C. اگر از مدیران کسی از این طرفها رد شد، پیشنهاد میکنم این تاپیک رو به تالار C انتقال بده.

hi level hdd
سه شنبه 21 اسفند 1386, 14:42 عصر
سلام

ما تونستیم فریم رو نمایش بدیم حالا نیاز داریم رنگهای درون فریم رو بخونیم

که اگر به صورت ماتریسی از رنگ باشه خیلی بهتره یعنی به صورت مثلا

*(frame+i+j) تا در یک لحظه همه عکس رو داشته باشیم تا پردازش سریع باشه

اندازه عکس و تعداد رنگ 640*480 و24bpp میخواهیم باشه

سرعت گرفتن فریم 12 تا تو ثانیه است چطور بیشترش کنیم

ممنون از راهنماییتون

someCoder
سه شنبه 21 اسفند 1386, 16:41 عصر
سلام

ما تونستیم فریم رو نمایش بدیم حالا نیاز داریم رنگهای درون فریم رو بخونیم

که اگر به صورت ماتریسی از رنگ باشه خیلی بهتره یعنی به صورت مثلا

*(frame+i+j) تا در یک لحظه همه عکس رو داشته باشیم تا پردازش سریع باشه

اندازه عکس و تعداد رنگ 640*480 و24bpp میخواهیم باشه

سرعت گرفتن فریم 12 تا تو ثانیه است چطور بیشترش کنیم

ممنون از راهنماییتون

همون faq که قبلا بهت رفرنس داده بودم، در این مورد هم توضیح داده (http://opencvlibrary.sourceforge.net/faq#head-bc4c5af36dbcbf25ad3a1d3e86c850452e1b45d3) که تو با عکس 24bpp (همون 3 کانال 8 بیتی) باید از این دستورات اسفاده کنی:

I(x,y)blue ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3]
I(x,y)green ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+1]
I(x,y)red ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+2]

برای افزایش frame rate، طبق تجربیات من به [درایور] سخت افزارت بیشتر مربوط میشه و فکر نکنم نرم افزاری بشه کاریش کرد (البته در این مورد اصلا مطمین نیستم) فقط برای اینکه مطمین باشی که برنامه تو عامل کم شدن frame rate نیست، تو برنامه نمونه اولی که برات نوشتم، حلقه رو اینجوری بنویس و ببین سرعت چی میشه:

while(frame && cvGetWindowHandle("testOpenCV")) {
cvShowImage("testOpenCV", frame);
if(cvWaitKey(10)==27) break;
frame = cvQueryFrame(capture);
}


ضمنا به عنوان یک توصیه: خیلی از الگوریتم هایی که تو پردازش تصویر کلیدی هستند رو خود OpenCV پیاده سازی کرده و خیلی خوب و سریع هم جواب میده. سعی کن قبل از اینکه کارت رو پیش ببری، با امکانات جالب OpenCV آشنا بشی تا دوباره کاری نکنی.

PS: الان که سرچ کردم اینو دیدم: http://tech.groups.yahoo.com/group/OpenCV/message/35906
بخونش. اطلاعات خوبی داره. (البته باید عضو گروه OpenCV تو یاهو بشی تا بتونی بخونی)

hi level hdd
سه شنبه 21 اسفند 1386, 21:08 عصر
خیلی ممنون از راهنماییهایتون

sarairavani
پنج شنبه 12 شهریور 1388, 10:56 صبح
من بعد از اجرا برنامه ارسال فرم به capture روی خط ,;(capture = cvCaptureFromCAM(-1
errorدارم : Unhandled exception at 0x00532c5d in Face_Det.exe: 0xC0000005: Access violation reading location 0x719b3856.

mostafanfs
شنبه 04 اردیبهشت 1389, 14:57 عصر
سلام جناب someCoder
میدونم این پست شما قدیمیه
ولی من نتونستم برنامه نمونه که گذاشتید رو کامپایل کنم با VS2008
الان OpenCV2.0 که آخرین نسخه هستش رو از سایت سورس فورج گرفتم و نصبه
تو برنامه شما هم محل رو تغییر دادم تو تنظیمات پروژه
منظورم همون محل پیش فرضی هستش که شما در نظر گرفتید
ولی موقع اجرا تا یه جا کامپایل می کنه بعد وسطش میگه که نمیتونم cxcore.lib رو پیدا کنم
در صورتی که چنین فایلی تو محل نصب OpenCV اصلا وجود نداره
یه سری فایل با عنوان cxcore هستش ولی هیچکدام lib. نیستند.
میشه کمک کنید ؟
چرا OpenCV یه جوریه ؟!
Someone Help Me
PLZ