Showing posts with label are. Show all posts
Showing posts with label are. Show all posts

How to determine how many cameras are connected to a computer and connect to and use ptz cameras

How to determine how many cameras are connected to a computer and connect to and use ptz cameras:

I figure this is a nice easy first post. This is some code I struggled with finding a couple years ago on automatically determining how many cameras are connected to a computer via directshow (this code is also useful in a ptz application as I will show right after). I use OpenCV to capture from the camera and the directshow library to use the ptz camera functions. I also used the vector and stringstream library for my own ease (#include<vector> #include<sstream>)

The DisplayError function is a generic wrapper for you to fill in, whether you use printf or a messagebox.

int getDeviceCount() {
  try {
    ICreateDevEnum *pDevEnum = NULL;
    IEnumMoniker *pEnum = NULL;
    int deviceCounter = 0;
    HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pDevEnum));
    if (SUCCEEDED(hr)) {
      // Create an enumerator for the video capture category.
      hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0);
      if (hr == S_OK) {
        IMoniker *pMoniker = NULL;
        while (pEnum->Next(1, &pMoniker, NULL) == S_OK) {
          IPropertyBag *pPropBag;
          hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)(&pPropBag));
          if (FAILED(hr)) {
            pMoniker->Release();
            continue; // Skip this one, maybe the next one will work.
          }
          pPropBag->Release();
          pPropBag = NULL;
          pMoniker->Release();
          pMoniker = NULL;
          deviceCounter++;
        }
        pEnum->Release();
        pEnum = NULL;
      }
      pDevEnum->Release();
      pDevEnum = NULL;
    }
    return deviceCounter;
  } catch(Exception & e) {
    DisplayError(e.ToString());
  } catch(...) {
    DisplayError("Error Caught Counting # of Devices");
  }
  return 0;
}


This can easily be modified to connect to x number of ptz cameras with a quick ptz class

Here is our ptz class:

class ptz {
public:
  struct controlVals {
  public:
    long min, max, step, def, flags;
  };
  IBaseFilter *filter;
  IAMCameraControl *camControl;

  bool valid, validMove;
  CvCapture *capture;
  bool Initialize() {
    camControl = NULL;
    controlVals panInfo = {0}, tiltInfo = {0};
    HRESULT hr = filter->QueryInterface(IID_IAMCameraControl, (void **)&camControl);
    if(hr != S_OK)
      return false;
    else
      return true;
  }

  void ptz(int instance) {

    threadNum = instance;
    // sets up a continuous capture point through the msvc driver
    capture = cvCaptureFromCAM(threadNum);
    if (!capture)
      valid = false;
    else
      valid = true;

  }
  void Destroy() {
    if(camControl) {
      camControl->Release();
      camControl = NULL;
    }
    if (filter) {
      filter->Release();
      filter = NULL;
    }
  }
};


And here is the modified getDeviceCount code which now connects to all the cameras and gets the ptz information using direct show:

int getDeviceCount(vector<ptz> &cameras) {
  try {
    ICreateDevEnum *pDevEnum = NULL;
    IEnumMoniker *pEnum = NULL;
    int deviceCounter = 0;

    HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pDevEnum));
    if (SUCCEEDED(hr)) {
      // Create an enumerator for the video capture category.
      hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0);
      if (hr == S_OK) {
        IMoniker *pMoniker = NULL;
        do {
          if (pEnum->Next(1, &pMoniker, NULL) == S_OK) {
            IPropertyBag *pPropBag;
            hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)(&pPropBag));
            if (FAILED(hr)) {
              pMoniker->Release();
              continue; // Skip this one, maybe the next one will work.
            }
            if (SUCCEEDED(hr)) {
              ptz tmp = ptz(deviceCounter);
              HRESULT hr2 = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**) & (tmp.filter));
              if (tmp.valid)
                tmp.validMove = tmp.Initialize();
            }
            pPropBag->Release();
            pPropBag = NULL;
            pMoniker->Release();
            pMoniker = NULL;
            deviceCounter++;
          } else {
            ptz tmp = ptz(deviceCounter);
            cameras.push_back(tmp);
            deviceCounter++;
            break;
          }
        }
        while (cameras[deviceCounter -1].valid);
        pEnum->Release();
        pEnum = NULL;
      }
      pDevEnum->Release();
      pDevEnum = NULL;
    }
    return deviceCounter;
  } catch(Exception & e) {
    DisplayError(e.ToString());
  } catch(...) {
    DisplayError("Error Caught Counting # of Devices");
  }
  return 0;
}


Notice now how we have integrated OpenCV into our ptz class. Now as we find cameras we can capture the camera information using OpenCV and then use directshow to grab the information used for ptz. To move the camera we can use  a pan and a tilt function like the following:

HRESULT MechanicalPan(IAMCameraControl *pCameraControl, long value) {
  HRESULT hr = 0;
  try {
    long flags = KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE | KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
    hr = pCameraControl->Set(CameraControl_Pan, value, flags);
    if (hr == 0x800700AA)
      Sleep(1);
    else if (hr != S_OK && hr != 0x80070490) {
      stringstream tmp;
      tmp << "ERROR: Unable to set CameraControl_Pan property value to " << value << ". (Error " << std::hex << hr << ")";
      throw Exception(tmp.str().c_str());
    }
    // Note that we need to wait until the movement is complete, otherwise the next request will
    // fail with hr == 0x800700AA == HRESULT_FROM_WIN32(ERROR_BUSY).
  } catch(Exception & e) {
    DisplayError(e.ToString());
  } catch(...) {
    DisplayError("Error Caught panning camera");
  }
  return hr;
}
// ----------------------------------------------------------------------------
HRESULT MechanicalTilt(IAMCameraControl *pCameraControl, long value) {
  HRESULT hr = 0;
  try {
    long flags = KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE | KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
    hr = pCameraControl->Set(CameraControl_Tilt, value, flags);
    if (hr == 0x800700AA)
      Sleep(1);
    else if (hr != S_OK && hr != 0x80070490) {
      stringstream tmp;
      tmp << "ERROR: Unable to set CameraControl_Tilt property value to " << value << ". (Error " << std::hex << hr << ")";
      throw Exception(tmp.str().c_str());
    }
    // Note that we need to wait until the movement is complete, otherwise the next request will
    // fail with hr == 0x800700AA == HRESULT_FROM_WIN32(ERROR_BUSY).
  } catch(Exception & e) {
    DisplayError(e.ToString());
  } catch(...) {
    DisplayError("Error Caught tilting camera");
  }
  return hr;
}




Consider donating to further my tinkering.


Places you can find me
Read More..

Young people who are changing the world through science



(Cross-posted from the Google for Education Blog)

Sometimes the biggest discoveries are made by the youngest scientists. They’re curious and not afraid to ask, and it’s this spirit of exploration that leads them to try, and then try again. Thousands of these inquisitive young minds from around the world submitted projects for this year’s Google Science Fair, and today we’re thrilled to announce the 20 Global Finalists whose bright ideas could change the world.

From purifying water with corn cobs to transporting Ebola antibodies through silk; extracting water from air or quickly transporting vaccines to areas in need, these students have all tried inventive, unconventional things to help solve challenges they see around them. And did we mention that they’re all 18 or younger?

We’ll be highlighting each of the impressive 20 finalist projects over the next 20 days in the Spotlight on a Young Scientist series on the Google for Education blog to share more about these inspirational young people and what inspires them.
Then on September 21st, these students will join us in Mountain View to present their projects to a panel of notable international scientists and scholars, eligible for a $50,000 scholarship and other incredible prizes from our partners at LEGO Education, National Geographic, Scientific American and Virgin Galactic.

Congratulations to our finalists and everyone who submitted projects for this year’s Science Fair. Thank you for being curious and brave enough to try to change the world through science.
Read More..

Robot Servants Are Going to Make Your Life Easy

...Then Theyll Ruin It.

Well thats the opinion of Evan Selinger in a recent article for Wired. JIBO, the "worlds first family robot" is heralding an age where robots or digital personal assistants anticipate our needs and perhaps even start making decisions for us. Thats where Selinger believes the danger lies. Watch the JIBO promotional video below and make up your mind.


from The Universal Machine http://universal-machine.blogspot.com/

IFTTT

Put the internet to work for you.

Turn off or edit this Recipe

Read More..

How good you are in SQL Simple SQL Quiz

This is a simple online Quiz to test your knowledge in SQL. At the end you can see the result.
Every time you refresh the page you will see a new set of questions.

Powered by : http://www.sqlquiz.com

Read More..

Why Watson and Siri Are Not Real AI

A recent article from Popular Mechanics 
raises the common argument that what people call AI actually isnt AI. This argument is based on John Searles Chinese Room thought experiment in which he clearly demonstrates that computers just manipulate symbols. They do not, cannot, ane never will understand what those symbols mean. However, Alan Turing, the father of AI, never claimed that machines would understand. His test for machine intelligence, now called the Turing Test, he originally called "the imitation game." He envisaged that computers would "imitate" intelligence not be intelligent in the sense that we are. Read the Popuar Mechanics article but keep this in mind - its ok for computers to imitate intelligence using different techiques to people just as its ok for planes to fly without flapping their wings like birds.




from The Universal Machine http://universal-machine.blogspot.com/

IFTTT

Put the internet to work for you.

via Personal Recipe 895909

Read More..

We are joining the Open edX platform



A year ago, we released Course Builder, an experimental platform for online education at scale. Since then, individuals have created courses on everything from game theory to philanthropy, offered to curious people around the world. Universities and non-profit organizations have used the platform to experiment with MOOCs, while maintaining direct relationships with their participants. Google has published a number of courses including Introduction to Web Accessibility which opens for registration today. This platform is helping to deliver on our goal of making education more accessible through technology, and enabling educators to easily teach at scale on top of cloud platform services.

Today, Google will begin working with edX as a contributor to the open source platform, Open edX. We are taking our learnings from Course Builder and applying them to Open edX to further innovate on an open source MOOC platform. We look forward to contributing to edX’s new site, MOOC.org, a new service for online learning which will allow any academic institution, business and individual to create and host online courses.

Google and edX have a shared mission to broaden access to education, and by working together, we can advance towards our goals much faster. In addition, Google, with its breadth of applicable infrastructure and research capabilities, will continue to make contributions to the online education space, the findings of which will be shared directly to the online education community and the Open edX platform.

We support the development of a diverse education ecosystem, as learning expands in the online world. Part of that means that educational institutions should easily be able to bring their content online and manage their relationships with their students. Our industry is in the early stages of MOOCs, and lots of experimentation is still needed to find the best way to meet the educational needs of the world. An open ecosystem with multiple players encourages rapid experimentation and innovation, and we applaud the work going on in this space today.

We appreciate the community that has grown around the Course Builder open source project. We will continue to maintain Course Builder, but are focusing our development efforts on Open edX, and look forward to seeing edX’s MOOC.org platform develop. In the future, we will provide an upgrade path to Open edX and MOOC.org from Course Builder. We hope that our continued contributions to open source education projects will enable anyone who builds online education products to benefit from our technology, services and scale. For learners, we believe that a more open online education ecosystem will make it easier for anyone to pick up new skills and concepts at any time, anywhere.
Read More..

Computer generated fake papers are flooding academia

This story is all over the Internet, even making the Guardian newspaper. Im not entirely sure I agree with the statement that fake papers are "flooding" academia, but nonetheless it is worrying that bogus papers are being published by reputable publishers like Springer and the IEEE. However, in their defense these organisations/publishers do delegate the decisions on academic quality to individual conference chairs and programme committees. Its also not true that conferences with poor or negligible standards are just restricted to China. In 2004 I had two MSc students write and submit papers to a conference taking place in Wellington, New Zealand (KES2004). The students work was not very good and the papers they wrote were quite unexceptional and I fully expected that they would be duly rejected. I thought the rejection would be a good learning experience for the students and may encourage them to work harder in future; both were somewhat arrogant.
    I was very surprised, and slightly mortified, when both papers were accepted by the conference. My name was on these papers as co-author and knew them to be substandard. Nonetheless, I thought that attending the conference might be a good experience for the students. When they returned I was very surprised to see that the conference proceedings, published by Springer in their LNCS series, ran to two volumes of 600+ pages each. Nowhere in the proceedings introduction did it say how many papers were submitted for review and what percentage were accepted. This conference series, run by a respected UK academic, seemed like a vanity publishing project to me.

from The Universal Machine http://universal-machine.blogspot.com/

IFTTT

Put the internet to work for you.

via Personal Recipe 895909

Read More..

With artificial intelligence we are summoning the demon

Well thats what Tesla chief executive Elon Musk has just warned us of in a lengthy talk to MIT Aeronautics and Astronautics departments Centennial Symposium. Heres a quote: "I think we should be very careful about artificial intelligence. If I were to guess like what our biggest existential threat is, its probably that. So we need to be very careful with the artificial intelligence. Increasingly scientists think there should be some regulatory oversight maybe at the national and international level, just to make sure that we dont do something very foolish. With artificial intelligence we are summoning the demon. In all those stories where theres the guy with the pentagram and the holy water, its like yeah hes sure he can control the demon. Didnt work out."
   By coincidence yesterday whilst watching a doco called Los Angeles Plays Itself I noted a comment in the film: "Robots wont be sexy and dangerous, theyll be boring and efficient - and take our jobs" that rather chimes with Musks thoughts.
You can watch his entire talk below.


from The Universal Machine http://universal-machine.blogspot.com/

IFTTT

Put the internet to work for you.

Turn off or edit this Recipe

Read More..

What Are The Advantages Of Cable Caddy

By Krystal Branch


Installing electrical wires and cables could certainly be challenging and sometimes even frustrating. However, there is a simple yet effective solution that drastically helps make the job easier. This is the cable caddy which makes handling and dispensing wires a whole lot easier and manageable.

Everyone who has been into the job of installing wires has been through the frustration of knotted and tangled wires. On top of that, there is the challenge of loading and unloading the wires. But that would be a thing of the past. This piece of equipment is designed to make is easier to transport and to systematically organize wires which therefore gets rid of the hassle of loading and unloading spools of wires.

These tools can be purchased in different designs, orientation and sizes, all designed to aid in specific needs. Which one you need to get depends on what specific wiring installation job needs to be done. The size of the wires and spools are also factors when purchasing the best one for you.

For outdoor electricians installing large wires outside the premises, large variants are the best options. These variants are designed to carry large spools of wires. These equipments typically carries spools with a height of 15 to 17 inches and a diameter of around eighteen to twenty inches.

To give it the exceptional strength required to dispense large and heavy spools of wires, metal or steel is usually used to manufacture them. The body is then treated with a coating that gives protection against corrosion and rust especially when placed outside. The body is also usually are made of hollow bars to keep it relatively light for easy handling. Also, light colors are used for these tools so that they remain highly visible on the roadside where they are usually placed when doing the installation.

Oftentimes, large variants holds the spool horizontally. This specific design makes it easier to setup the equipment and dispense the wires. When not in use, the piece could easily be folded. This makes it more convenient and easy to organize the tool after the installation is done.

Smaller variants are also available for indoor use. These holds smaller spools of wires that are used for indoor wiring. The design makes the variant more portable that large ones and can be placed horizontally or vertically whichever makes the installation easier.

As for the material, these types are not strictly made of steel. Materials used for these variants are light weight but strong. Also they are covered with materials or coatings that gives it smooth surface so that it does not scratch the walls or the paints while the equipment is being moved around. It small sized makes it portable and lighter so they usually come with only one handle for single hand lifting.

With the aid of a caddy, the job of installing wires has just become easier and lesser of a mess. Hence, it is now a must have if one wants to have the job finished without the hassle of tangled and knotted wires. This gets to show how a simple solution could assist in maximizing efficiency on the job.




About the Author:



Read More..