|
if it is a bmp, then i think you could go though each pixel and test the pixel around like this (i'm not an expert of image computing, so i could be wrong) :
for each vertical line -> 'y' coordinate
for each pixel in the line -> 'x' coordinate
if pixel color is red then
if pixel directly on top is red and
pixel directly at left is red and
pixel directly at right is red and
pixed directly at bottom is red then
you found the plus symbol, which coordinates are (x; y)
end if
end if
end for
end for
TOXCCT >>> GEII power
[VisualCalc 3.0 updated ][Flags Beginner's Guide new! ]
|
|
|
|
|
I know this way but it is a lot of noise in image and the plus isn't like this :
------------o--------
-----------ooo-------
------------o--------
it is like this :
-----------------------o-----------
-----------------------o-----------
-----------------------o-----------
---------------o o o o O --- o o o o
---------------------o------------
----------------------o-----------
----------------------o-----------
----------------------o-----------
and the most important is that it may rotate . and i dont want to rotate it in a ( for ) I want it to be a speedy algorithm . and i also want to use the long tail of plus , I mean it isn't one pixel .
thanks
-- modified at 10:19 Thursday 11th May, 2006
|
|
|
|
|
|
To find something like that I recommed correlation.
When you find your first red pixel, you sum the multiplication of all of the pixels in your defined "plus" with the ones in the appropriate location in the image. Since your image is noisy your defined "plus" needs to be thicker than a single pixel width. Once you get a total sum that exceeds a specified threshold, you declare that a "plus" has been found.
Since you have to deal with rotations, the appropriate locations for the multiplies will have to be computed taking different rotations into account. This will increase your processing time significantly. To reduce the number of iterations, once you find the first pixel you know that all other pixels will be right or down from there, assuming the origin is in the top left corner.
-- modified at 10:29 Thursday 11th May, 2006
|
|
|
|
|
You can use 2D-fft (or 2D convolution/correlation).
It will work also if there is a rotation on the plus (i.e. there is only a phase rotation) or if there is a scale factor (i.e. the ratio between frequency amplitudes remains constant),.....
but they aren't
V_shr wrote: speedy algorithm
If you want a good and fast way ,probally, your work will be very hard!
Try also something using some pre-processing operation, like noise filters and/or colors thresholds(-> RED plus)
Hope it helps
|
|
|
|
|
_Russell_ wrote: Try also something using some pre-processing operation, like noise filters and/or colors thresholds(-> RED plus)
Good!
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
I want, I want, I want.
Since this site is not about doing the job for you, but helping you with problems, I will point you in a good direction and wait to see what effort you make.
Search code project for the following types of article
image processing and pattern recognition
Some thoughts to consider are:
1) Are you looking for a specific size red plus or any two crossing lines of any thinkness and any length? It becomes easier if you know the exact size, thinkness of lines and orientation of the "plus"
2) How is the "plus" put on the image. Can it be partly off your image?
For a first cut approach, assuming you know the exact color red (or even the range of colors), try searching through each pixel in your image until you find a red one. Then you need to see if the shape of your plus is in the appropriate adjoining pixels (this is a series of checks over a specific set of offsets from your "found" red pixel. If you get a match, then you have to check some more to make sure that you are not in a field of red.
If your "plus" can be partly off the edge, you will have to compute the remaining portions of the plus and use the approach above with a modified definition of a "plus"
This is brute force. There are probably better ways to do this. But this will get you started.
Good luck.
|
|
|
|
|
|
You are wellcome
|
|
|
|
|
|
Humm...
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
|
toxcct wrote: pardon dear ?what's up ?
oops sorry! wrong person
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
VC Forum Q&A :- I/ IV ?
where are II and III
NiLeSh KoRpE
|
|
|
|
|
NiLeSh KoRpE wrote: where are II and III
Still Missing
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
|
|
|
|
|
|
Good luck; you'll need it. That's a sophisticated algorithm you're after. I suggest you get a good book on digital processing and don't expect results too quickly.
Steve
|
|
|
|
|
Hi,
for some reason I never receive the WM_LBUTTONUP message. I do receive the WM_LBUTTONDOWN message. Is this normal or I'm doing something wrong???
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
void CVRGlobalView::OnLButtonUp(UINT nFlags, CPoint point)
{
CTreeView::OnLButtonUp(nFlags, point);
}
Thanks!
-- modified at 9:30 Thursday 11th May, 2006
|
|
|
|
|
LukeV wrote: void CVRGlobalView::OnLButtonUp(UINT nFlags, CPoint point)
{
CTreeView::OnLButtonUp(nFlags, point);
}
What are you trying to do here exactly ?
And also, where are you releasing the mouse button ? Above the control ? And you want to know when the mouse is released above the tree control ?
Then, isn't it a notification message for the tree control itself ? I mean, instead of checking if the mouse is released above your view, check if the mouse is released above the control.
|
|
|
|
|
|
Hi all!
I'm working on a GUI frame work using Win32 C++. This GUI is based on classes and inheritance. I have stacked on something that might seem to be a little stupid! What's the best way to have access to the controls the most, and other vars of a window from another window!
For example:
// File Window.h
class CWindow
{
// Functions
public:
// Vars
private:
// Other vars
protected:
}
// File status.h
class CStatusBar : CWindow
{
// Functions
public:
// Vars
private:
// Other vars
protected:
}
// File MainFrame.h
class CMainFrame : CWindow
{
// Functions
public:
// Vars
private:
// Other vars
protected:
// Status bar control
CStatusBar* sb;
}
// File dialog.h
class CDialogBox : CWindow
{
// Functions
public:
// Vars
private:
// Other vars
protected:
}
I want the members of CDialogBox to have access to the status bar of the CMainFrame, even if the CMainframe is the parent of the parent of the CDialogBox
I don't want to use MFC way or a way like: Constructor(CWindow* parent, ..), or global variables.
If there's no such a way then what of the ways that I mensioned (and I don't like) would be more professional??
Thanks very much On whatever reply!
|
|
|
|
|
Dennis L wrote: I don't want to use MFC way
Is there a reason why ?
Dennis L wrote: what of the ways that I mensioned (and I don't like) would be more professional??
Use MFC. Why reinvent the wheel ?? Create a set of classes for a GUI framework is something very difficult. You will never be able to have something as powerfull as the MFC (or at leat not without spending a LOT of hours of work).
|
|
|
|
|
I have worked on MFC and I think that is a powerful package, but I'd like to create a very simple framework for now to check my abilities and what it would be like to create your own framework! If you please could tell me a way other than MFC I would appreciate it!
Thanks again!
|
|
|
|
|
First, why would a dialog need access to the mainframe's statusbar ?
Second, I think that you need to have a parent window for a child dialog box, me think that win32 needs it ( I'm no expert on win32, so YMMV ).
If your dialog box doesn't have a pointer to the mainframe, you will need to keep a global variable to the mainframe ( either a variable, or a global scope function that returns a pointer to the mainframe )
one other way would be to use some kind of messaging mecanism, either with ::SendMessage/::PostMessage or with a Observer/Observable pattern.
for example ( high level pseudo code )
CDialog::DoSomethingToMainFrameStatusBar()
{
CStatusBar* pStatusBar = YourMainFrameManager::GetStatusbar();
}
CStatusBar* YourMainFrameManager::GetStatusbar()
{
return pMainFrame->getStatusBar();
}
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|
|