java实现 k nn算法_java-C中的k-NN示例问题(OpenCV)
发布日期:2021-06-24 10:48:10 浏览次数:4 分类:技术文章

本文共 2680 字,大约阅读时间需要 8 分钟。

我在OpenCV文档中找到了以下使用k-NN的示例.现在,我的任务是将以下代码转换为 Java并对其进行一些更改,因为我的数据不是图像.

我很难理解示例中发生的事情.

首先来看看代码:

#include "ml.h"

#include "highgui.h"

int main( int argc, char** argv )

{

const int K = 10;

int i, j, k, accuracy;

float response;

int train_sample_count = 100;

CvRNG rng_state = cvRNG(-1);

CvMat* trainData = cvCreateMat( train_sample_count, 2, CV_32FC1 );

CvMat* trainClasses = cvCreateMat( train_sample_count, 1, CV_32FC1 );

IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );

float _sample[2];

CvMat sample = cvMat( 1, 2, CV_32FC1, _sample );

cvZero( img );

CvMat trainData1, trainData2, trainClasses1, trainClasses2;

// form the training samples

cvGetRows( trainData, &trainData1, 0, train_sample_count/2 );

cvRandArr( &rng_state, &trainData1, CV_RAND_NORMAL, cvScalar(200,200), cvScalar(50,50) );

cvGetRows( trainData, &trainData2, train_sample_count/2, train_sample_count );

cvRandArr( &rng_state, &trainData2, CV_RAND_NORMAL, cvScalar(300,300), cvScalar(50,50) );

cvGetRows( trainClasses, &trainClasses1, 0, train_sample_count/2 );

cvSet( &trainClasses1, cvScalar(1) );

cvGetRows( trainClasses, &trainClasses2, train_sample_count/2, train_sample_count );

cvSet( &trainClasses2, cvScalar(2) );

// learn classifier

CvKNearest knn( trainData, trainClasses, 0, false, K );

CvMat* nearests = cvCreateMat( 1, K, CV_32FC1);

for( i = 0; i < img->height; i++ )

{

for( j = 0; j < img->width; j++ )

{

sample.data.fl[0] = (float)j;

sample.data.fl[1] = (float)i;

// estimate the response and get the neighbors' labels

response = knn.find_nearest(&sample,K,0,0,nearests,0);

// compute the number of neighbors representing the majority

for( k = 0, accuracy = 0; k < K; k++ )

{

if( nearests->data.fl[k] == response)

accuracy++;

}

// highlight the pixel depending on the accuracy (or confidence)

cvSet2D( img, i, j, response == 1 ?

(accuracy > 5 ? CV_RGB(180,0,0) : CV_RGB(180,120,0)) :

(accuracy > 5 ? CV_RGB(0,180,0) : CV_RGB(120,120,0)) );

}

}

// display the original training samples

for( i = 0; i < train_sample_count/2; i++ )

{

CvPoint pt;

pt.x = cvRound(trainData1.data.fl[i*2]);

pt.y = cvRound(trainData1.data.fl[i*2+1]);

cvCircle( img, pt, 2, CV_RGB(255,0,0), CV_FILLED );

pt.x = cvRound(trainData2.data.fl[i*2]);

pt.y = cvRound(trainData2.data.fl[i*2+1]);

cvCircle( img, pt, 2, CV_RGB(0,255,0), CV_FILLED );

}

cvNamedWindow( "classifier result", 1 );

cvShowImage( "classifier result", img );

cvWaitKey(0);

cvReleaseMat( &trainClasses );

cvReleaseMat( &trainData );

return 0;

}

Link to the source

现在的问题.

1. cvRNG的类型是什么.在Java版本的OpenCV中找不到

2. CvMat样本= cvMat(1,2,CV_32FC1,_sample); -需要一个在Java中不可用的四字段构造函数.

3.为什么我需要形成培训样本?我该怎么做?

提到Here“仅支持CV_ROW_SAMPLE数据布局”.这是什么意思?

除了答案,还欢迎各种其他的工作示例.=)

转载地址:https://blog.csdn.net/weixin_32290249/article/details/114656377 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java接口的理解_Java接口的理解 - rabbit_mom的个人空间 - OSCHINA - 中文开源技术交流社区...
下一篇:数据结构java实验 刘小晶_数据结构实例解析与实验指导:Java语言描述

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月14日 13时35分17秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

快捷键 2019-04-28
实践1 2019-04-28
自动类型转换 2019-04-28
变量的作用域 2019-04-28
算术运算符 2019-04-28
比较运算符 2019-04-28
逻辑运算符 2019-04-28
位运算符 2019-04-28
条件运算符 2019-04-28
分支结构 2019-04-28
分支结构2 2019-04-28
分支结构3 2019-04-28
迭代结构 2019-04-28
迭代结构2 2019-04-28
迭代结构3 2019-04-28
九九乘法表 2019-04-28
break 2019-04-28
continue 2019-04-28
return 2019-04-28
一维数组 2019-04-28