你能说出这个代码有什么问题吗?用于检测星数的Opencv C ++。 [英] Can you say what is wrong with this code. Opencv C++ for detecting number of stars.

查看:145
本文介绍了你能说出这个代码有什么问题吗?用于检测星数的Opencv C ++。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 #includeopencv2 / imgcodecs.hpp
#includeopencv2 / imgproc.hpp
#includeopencv2 / highgui.hpp
#include opencv2 / opencv.hpp


using namespace cv;
using namespace std;


int main(int argc,char ** argv)

{



//阅读图片

Mat im = imread(image1.jpg,IMREAD_GRAYSCALE);



//设置SimpleBlobDetector参数。

SimpleBlobDetector :: Params params;



//更改阈值

params.minThreshold = 10;

params.maxThreshold = 200;



//按区域过滤。

params.filterByArea = true;

params.minArea = 1500;



//按循环过滤

params.filterByCircularity = true;

params.minCircularity = 0.1;



//按凸度过滤

params.filterByConvexity = true;

params.minConvexity = 0.87;



//按惯例过滤

params.filterByInertia = true;

params.minInertiaRatio = 0.01;





// blob的存储空间

vector< KeyPoint>关键点;



//用params设置检测器

Ptr< SimpleBlobDetector> detector = SimpleBlobDetector :: create(params);



//检测blob

detector-> detect(im,keypoints);


float count_keypoints;

count_keypoints = keypoints.size();

cout<< count_keypoints;
cout<< keypoints.size();

waitKey(0);



}





我的尝试:



无论我改变什么,都不会给出输出。

解决方案

编译没有意味着你的代码是对的! :笑:

将开发过程想象成编写电子邮件:成功编译意味着您使用正确的语言编写电子邮件 - 例如英语而不是德语 - 而不是电子邮件包含您的邮件想发送。



所以现在你进入第二阶段的发展(实际上它是第四或第五阶段,但你将在之后的阶段进入):测试和调试。



首先查看它的作用,以及它与你想要的有何不同。这很重要,因为它可以为您提供有关其原因的信息。例如,如果程序旨在让用户输入一个数字并将其翻倍并打印答案,那么如果输入/输出是这样的:

输入预期输出实际输出
1 2 1
2 4 4
3 6 9
4 8 16

然后很明显问题出在将它加倍的位 - 它不会将自身加到自身上,或者将它乘以2,它会将它自身相乘并返回输入的平方。

所以,你可以查看代码和很明显,它在某处:

  int   Double  int   value 
{
return value * ;
}



一旦你知道可能出现的问题,就开始使用调试器找出原因。在你的线上设一个断点:

 Mat im = imread(  image1.jpg,IMREAD_GRAYSCALE); 



并运行你的应用程序。在执行代码之前,请考虑代码中的每一行应该做什么,并将其与使用Step over按钮依次执行每一行时实际执行的操作进行比较。它符合您的期望吗?如果是这样,请转到下一行。

如果没有,为什么不呢?它有什么不同?



我们不知道它应该输出什么,也无论如何也无法运行它,所以它将由你来找到关于发生了什么的信息,以及你没想到的事情,或者你没有做到的事情。



这是一项技能,它是一个技能非常值得开发,因为它可以帮助您在现实世界和发展中。和所有技能一样,它只能通过使用来改善!


如果没有你的图像,这是无法真正回答的。我还希望你有一些输出像0.00或你的应用程序终止时出错。



你应该检查加载图像是否成功,因为你不会如果失败则得到一个结果:

 Mat im = imread(image1.jpg,IMREAD_GRAYSCALE); 
if(!im.data)
{
cout<< 无法打开或找到图像<<的std :: ENDL;
返回-1;
}

因为传递的文件名没有路径,所以必须确保将当前目录设置为包含图像文件的目录。虽然没有使用文件名参数,但我建议提供完整路径。



另请注意返回类型 vector :: size size_type (无符号整数类型)。虽然您可以将它分配给 float 但它完全没有意义,并且很容易因大尺寸而失去精确度。



我建议启用所有警告(G ++:项目设置中的-Wall,VS:/ W4)。这应该至少显示两个警告:一个用于将 vector :: size()返回值分配给 float 并且一个用于 main 函数末尾的返回语句(带有限制性编译器选项,这些也可能显示为错误)。


#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/opencv.hpp"


using namespace cv;
using namespace std;


int main(int argc, char** argv)

{



	// Read image

	Mat im = imread("image1.jpg", IMREAD_GRAYSCALE);



	// Setup SimpleBlobDetector parameters.

	SimpleBlobDetector::Params params;



	// Change thresholds

	params.minThreshold = 10;

	params.maxThreshold = 200;



	// Filter by Area.

	params.filterByArea = true;

	params.minArea = 1500;



	// Filter by Circularity

	params.filterByCircularity = true;

	params.minCircularity = 0.1;



	// Filter by Convexity

	params.filterByConvexity = true;

	params.minConvexity = 0.87;



	// Filter by Inertia

	params.filterByInertia = true;

	params.minInertiaRatio = 0.01;





	// Storage for blobs

	vector<KeyPoint> keypoints;



	// Set up detector with params

	Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params);



	// Detect blobs

	detector->detect(im, keypoints);


	float count_keypoints;

	count_keypoints = keypoints.size();

	cout << count_keypoints;
	cout << keypoints.size();

	waitKey(0);



}



What I have tried:

No matter what I change this no output will be given.

解决方案

Compiling does not mean your code is right! :laugh:
Think of the development process as writing an email: compiling successfully means that you wrote the email in the right language - English, rather than German for example - not that the email contained the message you wanted to send.

So now you enter the second stage of development (in reality it's the fourth or fifth, but you'll come to the earlier stages later): Testing and Debugging.

Start by looking at what it does do, and how that differs from what you wanted. This is important, because it give you information as to why it's doing it. For example, if a program is intended to let the user enter a number and it doubles it and prints the answer, then if the input / output was like this:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16

Then it's fairly obvious that the problem is with the bit which doubles it - it's not adding itself to itself, or multiplying it by 2, it's multiplying it by itself and returning the square of the input.
So with that, you can look at the code and it's obvious that it's somewhere here:

int Double(int value)
   {
   return value * value;
   }


Once you have an idea what might be going wrong, start using the debugger to find out why. Put a breakpoint on your line:

Mat im = imread("image1.jpg", IMREAD_GRAYSCALE);


and run your app. Think about what each line in the code should do before you execute it, and compare that to what it actually did when you use the "Step over" button to execute each line in turn. Did it do what you expect? If so, move on to the next line.
If not, why not? How does it differ?

We have no idea what it is supposed to output, and no way to run it anyway, so it going to be down to you to find out information about what is happening, and what it does that you didn't expect or does that you didn't.

This is a skill, and it's one which is well worth developing as it helps you in the real world as well as in development. And like all skills, it only improves by use!


This can't be really answered without having your image. I would also expect that you got some output like "0.00" or your application terminates with an error.

You should check if loading the image was successful because you will not get a result if that fails:

Mat im = imread("image1.jpg", IMREAD_GRAYSCALE);
if (!im.data)
{
    cout << "Could not open or find the image" << std::endl;
    return -1;
}

Because you pass a file name without path, you have to ensure that the current directory is set to the directory containing your image file. While not using a file name parameter, I suggest to provide the full path.

Note also that the return type of vector::size is size_type (an unsigned integral type). While you might assign it to a float it makes no sense at all and is prone to loss of precision with large sizes.

I suggest to enable all warnings (G++: -Wall, VS: /W4 in the project settings). That should show at least two warnings: One for assigning the vector::size() return value to a float and one for the missing return statement at the end of your main function (with restrictive compiler options these may be also shown as errors).


这篇关于你能说出这个代码有什么问题吗?用于检测星数的Opencv C ++。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆