一个基于opencv的C++程序解释

一个基于opencv的C++程序解释,第1张

int main( int argc, char** argv )

{

//========================================================

// CvCapture 是一个结构体,用来保存图像捕获所需要的信息

// opencv提供两种方式从外部捕获图像,一种是从摄像头中,一种

// 是通过解码视频得到图像。两种方式都必须从第一帧开始一帧一帧

// 的按顺序获取,因此每获取一帧后都要保存相应的状态和参数。

// 比如从视频文件中获取,需要保存视频文件的文件名,相应的解码器

// 类型,下一次如果要获取将需要解码哪一帧等。 这些信息都保存在

// CvCapture结构中,每获取一帧后,这些信息都将被更新,获取下一帧

// 需要将新信息传给获取的api接口

//=======================================================

CvCapture* capture = 0

//===========================================================

// IplImage 是结构体类型,用来保存一帧图像的信息,也就是一帧

// 图像的所有像素值构成的一个矩阵

//===========================================================

IplImage *frame, *frame_copy = 0

// 创建一个窗口,用“result”作为窗口的标识符

cvNamedWindow( "result", 1 )

// ==========================================

// 初始化一个视频捕获 *** 作。

// 告诉底层的捕获api我想从 Capture1.avi中捕获图片,

// 底层api将检测并选择相应的解码器并做好准备工作

//==============================================

capture = cvCaptureFromFile("c:\\Capture1.avi")

// 如果 初始化失败,那么capture为空指针,程序停止,

// 否则进入捕获循环

if( capture )

{

// 捕获循环

for()

{

// 调用cvGrabFrame,让底层api解码一帧图像

// 如果解码失败,就退出循环

// 如果成功,解码的图像保存在底层api的缓存中

if( !cvGrabFrame( capture ))

break

// 将解码得到图像信息从缓存中转换成IplImage格式放在frame中

frame = cvRetrieveFrame( capture )

// 如果获取缓存或转换失败,则退出循环

if( !frame )

break

// 将frame中的图像信息在窗口result中显示

cvShowImage( "result", frame )

// 暂停一会儿,让你看一下图像

Sleep(66.9)

// 如果你敲了键盘,就退出程序,否则继续捕获下一帧

if( cvWaitKey( 10 ) >= 0 )

break

}

// 退出程序之前要清理一下堆栈中的内存,免得内存泄露

cvReleaseImage( &frame_copy )

// 退出之前结束底层api的捕获 *** 作,免得它们占着茅坑不拉屎

// 比如会使得别的程序无法访问已经被它们打开的文件

cvReleaseCapture( &capture )

}

cvDestroyWindow("result")

return 0

}

够清楚了吧,good luck

整个项目的结构图:

编写DetectFaceDemo.java,代码如下:

[java] view

plaincopyprint?

package com.njupt.zhb.test

import org.opencv.core.Core

import org.opencv.core.Mat

import org.opencv.core.MatOfRect

import org.opencv.core.Point

import org.opencv.core.Rect

import org.opencv.core.Scalar

import org.opencv.highgui.Highgui

import org.opencv.objdetect.CascadeClassifier

//

// Detects faces in an image, draws boxes around them, and writes the results

// to "faceDetection.png".

//

public class DetectFaceDemo {

public void run() {

System.out.println("\nRunning DetectFaceDemo")

System.out.println(getClass().getResource("lbpcascade_frontalface.xml").getPath())

// Create a face detector from the cascade file in the resources

// directory.

//CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("lbpcascade_frontalface.xml").getPath())

//Mat image = Highgui.imread(getClass().getResource("lena.png").getPath())

//注意:源程序的路径会多打印一个‘/’,因此总是出现如下错误

/*

* Detected 0 faces Writing faceDetection.png libpng warning: Image

* width is zero in IHDR libpng warning: Image height is zero in IHDR

* libpng error: Invalid IHDR data

*/

//因此,我们将第一个字符去掉

String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1)

CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath)

Mat image = Highgui.imread(getClass().getResource("we.jpg").getPath().substring(1))

// Detect faces in the image.

// MatOfRect is a special container class for Rect.

MatOfRect faceDetections = new MatOfRect()

faceDetector.detectMultiScale(image, faceDetections)

System.out.println(String.format("Detected %s faces", faceDetections.toArray().length))

// Draw a bounding box around each face.

for (Rect rect : faceDetections.toArray()) {

Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0))

}

// Save the visualized detection.

String filename = "faceDetection.png"

System.out.println(String.format("Writing %s", filename))

Highgui.imwrite(filename, image)

}

}

package com.njupt.zhb.test

import org.opencv.core.Core

import org.opencv.core.Mat

import org.opencv.core.MatOfRect

import org.opencv.core.Point

import org.opencv.core.Rect

import org.opencv.core.Scalar

import org.opencv.highgui.Highgui

import org.opencv.objdetect.CascadeClassifier

//

// Detects faces in an image, draws boxes around them, and writes the results

// to "faceDetection.png".

//

public class DetectFaceDemo {

public void run() {

System.out.println("\nRunning DetectFaceDemo")

System.out.println(getClass().getResource("lbpcascade_frontalface.xml").getPath())

// Create a face detector from the cascade file in the resources

// directory.

//CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("lbpcascade_frontalface.xml").getPath())

//Mat image = Highgui.imread(getClass().getResource("lena.png").getPath())

//注意:源程序的路径会多打印一个‘/’,因此总是出现如下错误

/*

* Detected 0 faces Writing faceDetection.png libpng warning: Image

* width is zero in IHDR libpng warning: Image height is zero in IHDR

* libpng error: Invalid IHDR data

*/

//因此,我们将第一个字符去掉

String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1)

CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath)

Mat image = Highgui.imread(getClass().getResource("we.jpg").getPath().substring(1))

// Detect faces in the image.

// MatOfRect is a special container class for Rect.

MatOfRect faceDetections = new MatOfRect()

faceDetector.detectMultiScale(image, faceDetections)

System.out.println(String.format("Detected %s faces", faceDetections.toArray().length))

// Draw a bounding box around each face.

for (Rect rect : faceDetections.toArray()) {

Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0))

}

// Save the visualized detection.

String filename = "faceDetection.png"

System.out.println(String.format("Writing %s", filename))

Highgui.imwrite(filename, image)

}

}

3.编写测试类:

[java] view

plaincopyprint?

package com.njupt.zhb.test

public class TestMain {

public static void main(String[] args) {

System.out.println("Hello, OpenCV")

// Load the native library.

System.loadLibrary("opencv_java246")

new DetectFaceDemo().run()

}

}

//运行结果:

//Hello, OpenCV

//

//Running DetectFaceDemo

///E:/eclipse_Jee/workspace/JavaOpenCV246/bin/com/njupt/zhb/test/lbpcascade_frontalface.xml

//Detected 8 faces

//Writing faceDetection.png

package com.njupt.zhb.test

public class TestMain {

public static void main(String[] args) {

System.out.println("Hello, OpenCV")

// Load the native library.

System.loadLibrary("opencv_java246")

new DetectFaceDemo().run()

}

}

//运行结果:

//Hello, OpenCV

//

//Running DetectFaceDemo

///E:/eclipse_Jee/workspace/JavaOpenCV246/bin/com/njupt/zhb/test/lbpcascade_frontalface.xml

//Detected 8 faces

//Writing faceDetection.png

opencv本身是跨平台的,有各个平台,包括android/ios的版本。

所以基于标准OpenCV接口开发的代码,少量修改就可以移植到其他平台。

首先下载一个android版本的opencv

然后基于NDK编译它里面的一个mixed demo,这个demo实现了获取摄像头图像进行特征点检测。

特征点检测部分,是调用OpenCV的标准C++接口实现的。

你可以按照这个demo的方式,把你获取摄像头图像后处理的c++代码移植过来,理论上来说此部分只需要很少改动。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7813353.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存