|
Dear all
I am doing a project which my professor ask me to perform perspective reconstruction with 2 USB camera and C++.
May I know is it possible to get signal from the two USB camera by C++ at the same time?
Also, is it possible to perform real-time perspective reconstruction by C++?
Thank you
|
|
|
|
|
Here your answers:
- yes, it is possible: you have to use DirectShow to do it, instantiate two
IGraphBuilder and connect each of them to a different device - you have to add an
ISampleGrabber filter to each of the two IGraphBuilder : this will give you the ability to grab a frame from the two devices in your code and process them. Anyway, it depends on what you mean with real-time: the two devices are not synchronized each other, then the two frames are not referred to the same time (the maximum time unalignment between the two frames depends on the frame-rate of the two devices)
|
|
|
|
|
I have no knowledge about DirectShow, so I may asking some stupid question, sorry.
Reply to your answer.
If I have two USB camera and connecting to my compuer, how can i get the signal and store into IGraphBuilder? What code should I write?
After I looked for some reference, someone is using the following code to get the signal:
IMoniker * pMonCam1 = NULL;
IMoniker * pMonCam2 = NULL;
pMonCam1=getDevices(0);
pMonCam2=getDevices(1);
Is these code can already get the signal?
|
|
|
|
|
Using the DirectShow is a bit more complicated! As a pre-requisite, you need to be able to deal with COM programming.
Look at these links to get an idea about what you should do:
You can also have a look to the OpenCV library[^]: it's a huge library initially developed at Intel and later released to the open-source. It gives a lot of functionalities about image processing (OpenCV stands for Open Computer Vision), then you could find in it useful algorithms both to capture the video stream from various devices and to process the images aquired...
|
|
|
|
|
Hi I have two char array which I need to fill by parsing the string.
char * str = "1,aaa\r\n2,bbb\r\n3,ccc\r\n4,ddd\r\n"
now the the first value(1,2,3,4 in this case ) has to fill in first array and second value(aaa,bbb,ccc,ddd in this case) has to fill in second array.
Can anybody please help me how to do this.
please provide me a sample code if possible.
Thanks
|
|
|
|
|
Tokenize thrice. Once with "\r\n" as the delimiter to count the number of array elements. Allocate two new arrays with that size. Then repeat the previous tokenizing to split one line and then tokenize the got line with "," to get the number and the text. Keep an index counter and fill both the arrays simultaneously.
You must be able to code what I said.
...byte till it megahertz...
|
|
|
|
|
Thanx for ur reply, Can u please gv me some ssample code as I m new in c++.
|
|
|
|
|
NO.
...byte till it megahertz...
|
|
|
|
|
Well, because you have indeed attempted something, I'll help with a very very basic implementation.
void Job()
{
char *data = strdup("1,aaa\r\n2,bbb\r\n3,ccc\r\n4,ddd\r\n");
char *p = data;
int n = 0;
while(*p)
{
if('\r' == *p)
{
n++;
p++;
}
p++;
}
char **text = new char*[n];
int *nums = new int[n];
int i = 0;
char *tok = strtok(data, "\r\n");
while(tok)
{
char *t = tok;
while(*tok)
{
if(',' == *tok)
{
*tok = 0;
nums[i] = atoi(t);
t = tok+1;
}
tok++;
}
text[i] = strdup(t);
i++;
tok = strtok(NULL, "\r\n");
}
for(i = 0; i<n; i++)
free(text[i]);
delete [] text;
delete [] nums;
free(data);
}
It is not recommended to play around with too many pointers. Use std::string and std::vector in place of arrays. And use strtok_s(...) instead of strtok(...) to reduce those loops into simple function calls. I am using VC6 which doesn't have that and hence have written out those loops.
...byte till it megahertz...
|
|
|
|
|
does it not look as simple as tokenizing the strings on ',' and getting the last character of tokenized string to store in one array and the rest of the part in another after removing \r\n . If the last character is not a \n then only you need to add it to the array containing numbers.
I am a HUMAN. I have that keyword (??? too much) in my name........
_AnsHUMAN_b>
|
|
|
|
|
can u please send me some sample code .
|
|
|
|
|
As others already told you, the answer is tokenize the string alternating "," and "\r\n" as delimiters.
Nobody will give you a sample nor will do the work for you; if you don't know how to tokenize a string, look at strtok, wcstok, _mbstok (CRT)[^]
|
|
|
|
|
its nothing like that I hv not tried, but some where I stucked , Here by I m putting my code what I hv done till nw.
char* szStr = "2,aaa\r\n3,bbb\r\n4,ccc\r\n5,ddd\r\n6,eee\r\n" ;
int len = strlen(szStr);
char* tempstrlen = new char[len + 1 ];
char* tempstrst = new char[len + 1 ] ;
char* tempstr1 = NULL ;
char* tempstr2 = NULL ;
int nlang[12] ;
char* szTag[5] ;
memset(tempstrlen,0x00,sizeof(char) * (len + 1)) ;
memcpy(tempstrlen,szStr,sizeof(char) * len);
memset(tempstrst,0x00,sizeof(char) * (len + 1));
memcpy(tempstrst,szStr,sizeof(char) * len) ;
tempstr1 = tempstrlen ;
tempstr1 = strtok(tempstrst,"\r\n");
// nlang[0] = atoi(tempstr1) ;
szTag[0]= tempstr1 ;
int nCount = 0 ;
int nCountChar = 0 ;
while((tempstrst != NULL) && (nCount != 4))
{
tempstr1 = strtok(NULL,"\r\n");
szTag[nCount + 1]= tempstr1 ;
nCount++ ;
}
int i = 0;
char* txt = NULL ;
for(i = 0 ;i < 5 ; i++ );
{
txt = strtok(szTag[i],",");
nlang[0] = atoi(txt) ;
while(szTag!=NULL && i>=0)
{
txt = strtok(szTag[i],",");
nlang[i] = atoi(txt);
i++ ;
}
i++ ;
}
please go through that and tell me where I m going wrong.
|
|
|
|
|
Try to work around this snippet:
char *szStr = "2,aaa\r\n3,bbb\r\n4,ccc\r\n5,ddd\r\n6,eee\r\n";
char *token1 = strtok(szStr, ",");
char *token2 = strtok(NULL, "\r\n");
int n = 1;
while (token1 != NULL && token2 != NULL && n < 5)
{
token1 = strtok(NULL, ",");
token2 = strtok(NULL, "\r\n");
n++;
}
modified on Friday, August 6, 2010 7:49 AM
|
|
|
|
|
wow. Thats ridden with so many flaws. The main one is using tokenizing on a const char*. Did you simply type that out here ?
...byte till it megahertz...
|
|
|
|
|
It was lunch time and my stomach got the control over my brain!
|
|
|
|
|
Now it works properly:
char szStr[] = "2,aaa\r\n3,bbb\r\n4,ccc\r\n5,ddd\r\n6,eee\r\n";
char *token1 = strtok(szStr, ",");
char *token2 = strtok(NULL, "\r\n");
std::vector<int> nums;
std::vector<std::string> strings;
if (token1 != NULL && token2 != NULL)
{
nums.push_back(atoi(token1));
strings.push_back(token2);
}
while (token1 != NULL && token2 != NULL)
{
token1 = strtok(NULL, ",");
token2 = strtok(NULL, "\r\n");
if (token1 != NULL && token2 != NULL)
{
nums.push_back(atoi(token1));
strings.push_back(token2);
}
}
|
|
|
|
|
AbhiHcl wrote: its nothing like that I hv not tried, but some where I stucked...
Then use the debugger to find out where.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
I'm using Microsoft Visual Studio 2005 and I'm new to MFC application. The task I'm given is to create a popup menu (CMenu::CreatePopupMenu) somehow looks like a list control. This occurs to do some limitation of a list control.
Is there a way to do it without using WM_DRAWITEM and WM_MEASUREITEM? Or does anyone knows how to attach a popup menu onto a picture control (CStatic)? or ShowWindow to show the popup menu permanently? Either way is fine with me.
Will be waiting for reply~ TQ!!!
Sincerely,
arthur89kim
|
|
|
|
|
Can you explain a bit more what you need?
What I understood is that you want to use a popup menu instead than a list control because you want something like a list control with reduced functionalities and custom behaviours; isn't it?
Can't you write a class that inherit from CListCtrl and modifies the standard behaviours?
|
|
|
|
|
Yes. Just like what u mentioned. What I need to do is to create a popup menu literally looks like list control. The reason why I do so is because I found out that the list control icon attribute as following...
m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES | LVS_EX_FULLROWSELECT);
...where when I click on one of the item, I manage to select the whole row but not able to highlight the icon itself. If u have notice, when you put in the above code, there will be an empty white space reserved for the icon to be loaded. My original task is to eliminate that white space (in other words is to make it transparent).
For example, I'm trying to make the list control to be exactly same as the right click button in Adobe PDF reader where i can select whole row with icon (transparent background) and a tick (check mark).
By the way, the icons I obtained is from EnumWindowProc where I get from Window Application (same as ALT + TAB button)
Sincerely,
arthur89kim
|
|
|
|
|
Then what you want is a list control with a customized appearance.
For this, the best is to use a owner-draw list control with the owner-draw property set (i.e. created using the LVS_OWNERDRAWFIXED style); then process the WM_DRAWITEM to give your control the apeearance you want.
Look at these links for some samples:
|
|
|
|
|
Thanks for the reply. I'll look into it. I was hoping to find alternative way to solve it without using owner-draw or other drawing method. If that's the case, I shall study on it. Thanks again.
Sincerely,
arthur89kim
|
|
|
|
|
I'm not sure that I fully understand your question, but a popup menu is, by its nature, a transient item. It pops up, the user makes a selection, it disappears. If you want some sort of permanent list on display I think you may need to use a different control. Perhaps you could give some more detail on the problem you are trying to solve.
It's time for a new signature.
|
|
|
|
|
What I need to do is to create a popup menu literally looks like list control. The reason why I do so is because I found out that the list control icon attribute as following...
m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES | LVS_EX_FULLROWSELECT);
...where when I click on one of the item, I manage to select the whole row but not able to highlight the icon itself. If u have notice, when you put in the above code, there will be an empty white space reserved for the icon to be loaded. My original task is to eliminate that white space (in other words is to make it transparent).
For example, I'm trying to make the list control to be exactly same as the right click button in Adobe PDF reader where i can select whole row with icon (transparent background) and a tick (check mark).
By the way, the icons I obtained is from EnumWindowProc where I get from Window Application (same as ALT + TAB button).
Sincerely,
arthur89kim
|
|
|
|
|