برق، الکترونیک، الکتروتکنیک، مکاترونیک، پزشکی، کشاورزی

برق، الکترونیک، الکتروتکنیک، مکاترونیک، پزشکی، کشاورزی و

برق، الکترونیک، الکتروتکنیک، مکاترونیک، پزشکی، کشاورزی

برق، الکترونیک، الکتروتکنیک، مکاترونیک، پزشکی، کشاورزی و

داده هایی در مورد برق، الکترونیک، الکتروتکنیک، مکاترونیک، پزشکی، کشاورزی و

تبلیغات
آخرین نظرات

۵۲ مطلب با موضوع «نرم افزار» ثبت شده است

رابط گرافیکی اپن سی وی

ShahBaz | شنبه, ۱۳ شهریور ۱۳۹۵، ۰۶:۴۳ ب.ظ
  • ShahBaz

Create structuring element for morphological operations - getStructuringElement

ShahBaz | سه شنبه, ۹ شهریور ۱۳۹۵، ۱۰:۰۱ ق.ظ

Create structuring element for morphological operations

Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1))

Parameters:
  • shape – Element shape that could be one of the following:
    • MORPH_RECT (0) - a rectangular structuring element:
      E_{ij}=1
    • MORPH_ELLIPSE (2) - an elliptic structuring element, that is, a filled ellipse inscribed into the rectangle Rect(0, 0, esize.width, esize.height)
    • MORPH_CROSS (1)- a cross-shaped structuring element:
      E_{ij} =  \fork{1}{if i=\texttt{anchor.y} or j=\texttt{anchor.x}}{0}{otherwise}
    • CV_SHAPE_CUSTOM (100) - custom structuring element (OpenCV 1.x API)
  • ksize – Size of the structuring element.
  • cols – Width of the structuring element
  • rows – Height of the structuring element
  • anchor – Anchor position within the element. The default value (-1,-1) means that the anchor is at the center. Note that only the shape of a cross-shaped element depends on the anchor position. In other cases the anchor just regulates how much the result of the morphological operation is shifted.
The structuring element is required to be passed to createMorphologyFilter(), erode(), dilate() or morphologyEx().

You can also construct an arbitrary binary mask yourself and use it as the structuring element.

  Example:

--------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
 
using namespace cv;
using namespace std;
 
int main()
{
 
    // Create a structuring element (SE)
    int morph_size = 3;
    Mat element = getStructuringElement( MORPH_ELLIPSE, Size( 4*morph_size + 1, 2*morph_size+1 ), Point( morph_size, morph_size ) );
    cout<<element;
 
    return 0;
}

--------
  • ShahBaz

تشخیص رنگ در اپن سی وی

ShahBaz | سه شنبه, ۹ شهریور ۱۳۹۵، ۰۱:۴۸ ق.ظ

Lets start by thresholding the input image for anything that is not red. Instead of the usual RGB color space we are going to use the HSV space, which has the desirable property that allows us to identify a particular color using a single value, the hue, instead of three values. As a side note, in OpenCV H has values from 0 to 180, S and V from 0 to 255. The red color, in OpenCV, has the hue values approximately in the range of 0 to 10 and 160 to 180.

Next piece of code converts a color image from BGR (internally, OpenCV stores a color image in the BGR format rather than RGB) to HSV and thresholds the HSV image for anything that is not red:

 1 	...
 2 	// Convert input image to HSV
 3 	cv::Mat hsv_image;
 4 	cv::cvtColor(bgr_image, hsv_image, cv::COLOR_BGR2HSV);
 5 
 6 	// Threshold the HSV image, keep only the red pixels
 7 	cv::Mat lower_red_hue_range;
 8 	cv::Mat upper_red_hue_range;
 9 	cv::inRange(hsv_image, cv::Scalar(0, 100, 100), cv::Scalar(10, 255, 255), lower_red_hue_range);
10 	cv::inRange(hsv_image, cv::Scalar(160, 100, 100), cv::Scalar(179, 255, 255), upper_red_hue_range);
11 	...

Preprocess the image using cv::inRange() with the necessary color bounds to isolate red. You may want to transform to a color-space like HSV or YCbCr for more stable color bounds because chrominance and luminance are better separated. You can use cvtColor() for this. Check out my answer here for a good example of using inRange() with createTrackbar().

So, the basic template would be:

Mat redColorOnly;
inRange(src, Scalar(lowBlue, lowGreen, lowRed), Scalar(highBlue, highGreen, highRed), redColorOnly);
detectSquares(redColorOnly);

EDIT : Just use the trackbars to determine the color range you want to isolate, and then use the color intervals you find that work. You don't have to constantly use the trackbars.

EXAMPLE :
So, for a complete example of the template here you go,

I created a simple (and ideal) image in GIMP, shown below: enter image description here

Then I created this program to filter all but the red squares:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace std;
using namespace cv;

Mat redFilter(const Mat& src)
{
    assert(src.type() == CV_8UC3);

    Mat redOnly;
    inRange(src, Scalar(0, 0, 0), Scalar(0, 0, 255), redOnly);

    return redOnly;
}

int main(int argc, char** argv)
{
    Mat input = imread("colored_squares.png");

    imshow("input", input);
    waitKey();

    Mat redOnly = redFilter(input);

    imshow("redOnly", redOnly);
    waitKey();

    // detect squares after filtering...

    return 0;
}

NOTE : You will not be able to use these exact same filter intervals for your real imagery; I just suggest you tune the intervals with trackbars to see what is acceptable.

The output looks like this:

enter image description here

Viola! Only the red square remains :)

Enjoy :)


  • ShahBaz

انجمن های به اشتراک گذاشته شده

ShahBaz | پنجشنبه, ۴ شهریور ۱۳۹۵، ۰۶:۱۶ ب.ظ
  • ShahBaz

الگوریتم Viola-Jones برای تشخیص چهره

ShahBaz | سه شنبه, ۲ شهریور ۱۳۹۵، ۰۶:۱۳ ب.ظ


الگوریتم Viola-Jones برای تشخیص چهره

این پست در پاسخ یکی از خوانندگان قرار داده شده ( درخواست موضوع )

Viola - Jones الگوریتم AdaBoost رو با Cascade واسه تشخیص چهره ترکیب کردن . الگوریتم پیشنهادی شون می تونست چهره رو تو یه تصویر 384×288 با صرف زمانی معادل 0.067 ثانیه تشخیص بده. یعنی 15 بار سریع تر از آشکار ساز های state-of-the-art با دقتی بالاتر ، به طوریکه این الگوریتم یکی از پیشرفته ترین الگوریتم های ماشین بینایی در دهه ی گذشته تا به حال بوده . اما یه توضیح مختصر در مورد این که نقش AdaBoost در این الگوریتم چیه ؟ می تونه این باشه که : در ابتدا تصویر مورد نظر به زیر تصاویر ( 24×24 ) تقسیم بندی میشه. هر زیر تصویر بیانگر یه بردار ویژگی هستش. واسه این که محاسبات موثر و کارآمد باشه ، از یه سری ویژگی های خیلی ساده استفاده می کنیم . تمام مستطیل های ممکن تو زیر تصویر بررسی میشن. در هر مستطیل ، 4 نمونه ویژگی به کمک ماسک هایی که در شکل زیر اومده استخراج میشه . ( 4 ماسک ویژگی که واسه هر مستطیل استفاده میشه )

با هرکدوم از این ماسکها ، مجموع پیکسل های سطح خاکستری در نواحی سفید از مجموع پیکسل ها ی نواحی سیاه ، کم میشه. که این مقدار به عنوان یه ویژگی در نظر گرفته میشه. پس می تونیم اینطوری بگیم که تو یه زیر تصویر ( 24×24 ) بالغ بر 1 میلیون ویژگی می تونیم داشته باشیم ( البته این ویژگی ها خیلی سریع محاسبه میشن !! و می تونن کمتر از 1 میلیون ویژگی هم باشن مثلا 160000 در هر زیر تصویر )

هر ویژگی به عنوان یه یادگیرنده ی ضعیف در نظر گرفته می شه، یعنی :  

الگوریتم یادگیری پایه تلاش میکنه که بهترین کلاسیفایر ضعیف  رو که ، کوچیک ترین خطا رو در کلاسبندی داره پیدا کنه.

 مستطیل های چهره رو به عنوان مثالهای positive در نظر میگیریم. تو شکل زیر اومده:( مثالهای آموزشی مثبت)  

و مستطیل هایی که شامل تمام چهره نمیشن ، به عنوان مثالهای آموزشی Negative تلقی میشن. سپس الگوریتم AdaBoost رو اعمال میکینم ، ایشون تعدادی یادگیرنده ی ضعیف رو برمیگردونن ، که هرکدوم از اینا مربوط به یکی از 1 میلیون ویژگی هایی هست که داریم. درواقع اینجا ، AdaBoost می تونه به عنوان یه ابزار واسه انتخاب ویژگی در نظر گرفته بشه.

در ابتدا دو تا ویژگی و موقعیت مربوط به اونا در چهره انتخاب میشه . بدیهی که هر دو ویژگی بصری هستن. که اولین ویژگی اختلاف مقدار شدت روشنایی نواحی چشم و قسمتهای پایین تر از اون رو اندازه گیری میکنه و دومین ویژگی اختلاف مقدار شدت روشنایی نواحی چشمها با نواحی بین چشمها رو اندازه میگیره . با استفاده از ویژگی های انتخاب شده ، یه درخت نامتعادل ساخته میشه که بهش کلاسیفایر Cascade میگن . به شکلها دقت کنین :

پارامتر در Cascade تنظیم میشه به طوریکه ، در هر نود درخت ، ما یه انشعاب not a face داریم و معنیش اینه که تصویر ، یه تصویر چهره نبوده ، یا به عبارت دیگه ، نرخ false negative داره به حداقل میرسه. ایده ی این طرح در واقع می خواد بگه تصویر غیره چهره زودتر شناسایی میشه. به طور متوسط در هر زیر تصویر 10 تا ویژگی رو مورد بررسی قرار میدیم. اینم تعدادی آزمایش که Viola – Jones روی تصاویر انجام دادن :

البته می شه از جعبه ابزار متلب هم واسه تشخیص چهره با الگوریتم Viola - Jones استفاده کرد به این صورت


close all

clc

%Detect objects using Viola-Jones Algorithm

%To detect Face

FDetect = vision.CascadeObjectDetector;

%Read the input image

I = imread('face3.jpg');

%Returns Bounding Box values based on number of objects

BB = step(FDetect,I);

figure,

imshow(I); hold on

for i = 1:size(BB,1)

    rectangle('Position',BB(i,:),'LineWidth',5,'LineStyle','-','EdgeColor','r');

end

title('Face Detection');

hold off;

http://blogsoftware.blogfa.com/1392/07/3


روش Viola-Jones یکی از روش های بسیار موفق و سریع در تشخیص چهره بشمار می آید.
بحث در این باره بسیار زیاد است و من مختصرا بصورت فهرست وار بیان می کنم.
معمولا این روش با استفاده از Bossting کار خود را انجام می دهد در الگوریتم های بوستینگ بصورت تکراری سعی می شود نتایج بهبود یابند.
عمدتا روش ویولا-جونز با استفاده از ویژگی شبه هار (Haar Features) کار خود را انجام میدهد و در آن مقاله معروف آقای ویولا و جونز در 2001 به استفاده از یک روش سریع برای محاسبه مقدار ویژگی های شبه هار با عنوان Integral Image اشاره شده است. این مقاله تاکنون بیش از 5000 رفرنس داده شده دارد و هنوز زمینه تحقیقات پیرامون این موضوع باز است.

همچنین جهت اطلاعات بیشتر به تاپیکی که خانم ریحانه تهیه کرده اند مراجعه فرمایید.
http://artificial.ir/intelligence/thread2338.html


  • ShahBaz

نصب ماژول ها در اپن سی وی

ShahBaz | يكشنبه, ۳۱ مرداد ۱۳۹۵، ۰۷:۵۶ ب.ظ

sudo su
cd /home/elinux/opencv-3.1.0/build

cmake -DOPENCV_EXTRA_MODULES_PATH=/home/elinux/opencv_contrib-master/modules -DBUILD_opencv_legacy=OFF /home/elinux/opencv-3.1.0

  • ShahBaz

کنترل موس

ShahBaz | شنبه, ۳۰ مرداد ۱۳۹۵، ۱۰:۴۴ ق.ظ

C++ move mouse in windows using SetCursorPos

6 down vote favorite

I created a device similar to a wiimote and i want to use it as a mouse in windows (8.1). The device connects over tcp to a c++ win32 program on my windows computer and sends the position where the mouse cursor should move. I am using the SetCursorPos function to set the position, which works great to control most programs. But when I try to control for example the task manager, the cursor doesn't move anymore. When I switch from the task manager back to some other program it works again. I also tried to use the SendInput function with the same results.

This is what my code looks like with SendInput:

INPUT Input = { 0 };
Input.type = INPUT_MOUSE;

Input.mi.dx = (LONG)posX;
Input.mi.dy = (LONG)posY;

// set move cursor directly
Input.mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;

SendInput(1, &Input, sizeof(INPUT));

With SetCursorPos it's just one line:

SetCursorPos(posX, posY);

Can anybody tell me why it doesn't work for some programs? I know it has to be possible to do this, since I tried a smartphone app which controls the cursor and it worked in all programs.

You cannot set the cursor position or input of a window that required higher privileges than your program has..

If you want your program to be able to move the cursor over task manager, you require the same privileges as task manager: Administrator Privileges.

This is how it is done on Windows 8+.

I tried it with the following:

int main()
{
    HWND window = FindWindow("TaskManagerWindow", "Task Manager");
    if (window)
    {
        RECT rect = {0};
        GetWindowRect(window, &rect);

        SetForegroundWindow(window);
        SetActiveWindow(window);
        SetFocus(window);
        Sleep(300);
        SetCursorPos(rect.right - 200, rect.bottom - 200);
    }

    return 0;
}

Cursor only moves over task manager when ran as admin. It is the same for all context menus and windows in Windows 8+. Not just task manager.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms648394(v=vs.85).aspx


http://docs.opencv.org/3.1.0/dc/d3b/classcv_1_1viz_1_1MouseEvent.html#details

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


http://randomlinux.com/around-the-web/xdotool-mouse/

این کد رو داخل ترمینال بزنی موس به مختصات 500 و 500 میره
xdotool mousemove 500 500

برای استفاده در برنامه هایی که به زبان سی ++ نوشه می شوند باید کتابخانه های

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <vector>


اینکلود شده باشند.

---------------------------------------


http://forum.ubuntu.ir/index.php/topic,138781.0.html

  • ShahBaz

تشخیص حرکت و کلیک موس در اپن سی وی

ShahBaz | جمعه, ۲۹ مرداد ۱۳۹۵، ۰۳:۵۴ ب.ظ

How to Detect Mouse Clicks and Moves

OpenCV supports for detecting mouse events. Mouse events include mouse clicks and movements over an attached OpenCV window.


OpenCV Example Code


It is very simple to do that. All you have do is to define a callback function in the OpenCV C++ code attaching to the OpenCV window. That callback function will be called every time, mouse events occur. That callback function will also give the coordinates of the mouse events. (e.g - (x, y) coordinate of a mouse click).

Here is the simple OpenCV code to detect left, right and middle mouse clicks and mouse movements with its coordinates

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace std;
using namespace cv;

void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{
if  ( event == EVENT_LBUTTONDOWN )
{
cout << "Left button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;
}
else if  ( event == EVENT_RBUTTONDOWN )
{
cout << "Right button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;
}
else if  ( event == EVENT_MBUTTONDOWN )
{
cout << "Middle button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;
}
     else if ( event == EVENT_MOUSEMOVE )
     {
          cout << "Mouse move over the window - position (" << x << ", " << y << ")" << endl;

     }
}

int main(int argc, char** argv)
{
// Read image from file 
Mat img = imread("MyPic.JPG");

//if fail to read the image
if ( img.empty() ) 

cout << "Error loading the image" << endl;
return -1; 
}

//Create a window
namedWindow("My Window", 1);

//set the callback function for any mouse event
setMouseCallback("My Window", CallBackFunc, NULL);

//show the image
imshow("My Window", img);

// Wait until user press some key
waitKey(0);

return 0;

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

You can download this OpenCV visual C++ project from here

Detect Mouse Clicks and Moves Over the OpenCV Window
Detect Mouse Clicks and Moves Over the OpenCV Window


Summary

In the above OpenCV sample code,  "CallbackFunc" function will be called on any mouse event (Moving a mouse over the attached OpenCV window is also a mouse event). By using suitable if - else blocks, I printed only left, right and middle mouse clicks and mouse movements over the window.

Here are new OpenCV functions, found in the above example code. If you are not familiar with the other OpenCV functions as well, please go through the other lessons in this tutorial.


  • void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata = 0)
This function sets a callback function to be called every time any mouse events occurs in the specified window. Here is the detailed explanation of the each parameters of the above OpenCV function.
    • winname - Name of the OpenCV window. All mouse events related to this window will be registered
    • onMouse - Name of the callback function. Whenever mouse events related to the above window occur, this callback function will be called. This function should have the signature like the following
      • void FunctionName(int event, int x, int y, int flags, void* userdata)
        • event - Type of the mouse event. These are the entire list of mouse events
          • EVENT_MOUSEMOVE
          • EVENT_LBUTTONDOWN
          • EVENT_RBUTTONDOWN
          • EVENT_MBUTTONDOWN
          • EVENT_LBUTTONUP
          • EVENT_RBUTTONUP
          • EVENT_MBUTTONUP
          • EVENT_LBUTTONDBLCLK
          • EVENT_RBUTTONDBLCLK
          • EVENT_MBUTTONDBLCLK
        • x - x coordinate of the mouse event
        • y - y coordinate of the mouse event
        • flags - Specific condition whenever a mouse event occurs. See the next OpenCV example code for the usage of this parameter. Here is the entire list of enum values which will be possesed by "flags"
          • EVENT_FLAG_LBUTTON
          • EVENT_FLAG_RBUTTON
          • EVENT_FLAG_MBUTTON
          • EVENT_FLAG_CTRLKEY
          • EVENT_FLAG_SHIFTKEY
          • EVENT_FLAG_ALTKEY
        • userdata - Any pointer passes to the "setMouseCallback" function as the 3rd parameter (see below)
    • userdata - This pointer will be passed to the callback function

OpenCV Example to Detect Mouse Clicks While Pressing a Key

I am going to explain you how to detect a mouse event while pressing a key of the keyboard. 
The following OpenCV example code will detect left mouse clicks while pressing the "CTRL" key , right mouse clicks while pressing the "SHIFT" key and movements of the mouse over the OpenCV window while pressing the "ALT" key.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace std;
using namespace cv;

void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{
if ( flags == (EVENT_FLAG_CTRLKEY + EVENT_FLAG_LBUTTON) )
{
cout << "Left mouse button is clicked while pressing CTRL key - position (" << x << ", " << y << ")" << endl;
}
else if ( flags == (EVENT_FLAG_RBUTTON + EVENT_FLAG_SHIFTKEY) )
{
cout << "Right mouse button is clicked while pressing SHIFT key - position (" << x << ", " << y << ")" << endl;
}
else if ( event == EVENT_MOUSEMOVE && flags == EVENT_FLAG_ALTKEY)
{
cout << "Mouse is moved over the window while pressing ALT key - position (" << x << ", " << y << ")" << endl;
}
}

int main(int argc, char** argv)
{
// Read image from file 
Mat img = imread("MyPic.JPG");

//if fail to read the image
if ( img.empty() ) 

cout << "Error loading the image" << endl;
return -1; 
}

//Create a window
namedWindow("My Window", 1);

//set the callback function for any mouse event
setMouseCallback("My Window", CallBackFunc, NULL);

//show the image
imshow("My Window", img);

// Wait until user press some key
waitKey(0);

  return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

You can download this visual C++ OpenCV project from here.

No new OpenCV functions in the above example. If you have some doubt about any OpenCV functions in the above example, please refer to previous lessons.


Next Tutorial : Rotate Image & Video

Previous Tutorial : How to Add Trackbar

  

  • ShahBaz