gpt4 book ai didi

c++ - 在图像中的一些点周围绘制边界

转载 作者:行者123 更新时间:2023-11-28 06:20:33 25 4
gpt4 key购买 nike

我最近开始研究 opencv。我有一个图像,在一条线上有几个点。我想在这些点周围制作一个矩形边框。我已经应用了一些基本的 C 算法,但它对我不起作用。这是我的代码。

int main()

{

cv::Mat image = imread("C:/Users/Ravi Sharma/Desktop/img.bmp");

for(int i =0; i < image.rows; i++){
for(int k = 0; k <image.cols; k ++){
if((image.at<cv::Vec3b>(k,i)[0] == 0)&&(image.at<cv::Vec3b>(k,i)[1] == 135)&&(image.at<cv::Vec3b>(k,i)[2] == 255))
{
(image.at<cv::Vec3b>(k,i)[0] = 0)&&(image.at<cv::Vec3b>(k,i)[1] = 0)&&(image.at<cv::Vec3b>(k,i)[2] = 255);
}
}

}
imwrite("C:/Users/Ravi Sharma/Desktop/img1.bmp",image);
cv::namedWindow("Window1");
cv::imshow("Window1",image);
cv::waitKey(50000);
return 1;
}

此代码不更新像素值。请帮助我更正代码以获得所需的结果。我如何使用 cvminmaxloc 函数来做同样的事情。提前致谢。

最佳答案

我假设您的图像可以被视为二进制掩码,并且我们只对具有非零值的像素感兴趣。

The assumed input Bounding box around points in the input image

要找到上方左图中各点周围的边界框,请遍历图像中的所有像素。对于每个非零像素,检查其是否为 xy -location 位于当前边界框之外。如果是,则更新您的边界框。生成的边界框将包围所有点,如右上图所示。

下面是一个最低限度的工作示例,它生成一个图像,其中包含确定边界框的随机采样点。

// This example uses OpenCV 3.0.0-beta. To use with OpenCV 2.4.* a
// few changes have to be made.

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

cv::Mat randomPoints( cv::Size size = cv::Size( 320, 240 ), int pointCount = 25 )
{
cv::RNG rng( cv::getCPUTickCount() );
cv::Mat image = cv::Mat3b::zeros( size );
int radius = 3;
cv::Scalar color( 0, 153, 255 );
int thickness = -1;
int margin = std::min( size.height, size.width ) / 4;

for ( int i = 0; i < pointCount; ++i )
{
cv::Point p;
p.x = rng.uniform( margin, size.width - margin - 1 );
p.y = rng.uniform( margin, size.height - margin - 1 );
cv::circle( image, p, radius, color, thickness );
}

return image;
}

int main( int argc, char ** argv )
{
#if 0
cv::Mat image = imread( "C:/Users/Ravi Sharma/Desktop/img.bmp" );
#else
cv::Mat image = randomPoints();
#endif

cv::Mat imageGray;
cv::cvtColor( image, imageGray, cv::COLOR_BGR2GRAY );
cv::Size size = imageGray.size();

// The bounding box is defined by its top-left (TL) and bottom-right (BR)
// coordinates.
cv::Point tl( size.width, size.height );
cv::Point br( 0, 0 );
bool hasPoints = false;

for ( int y = 0; y < size.height; ++y )
{
for ( int x = 0; x < size.width; ++x )
{
if ( imageGray.at<unsigned char>( y, x ) > 0 )
{
hasPoints = true;

// Update the top-left corner.
if ( x < tl.x ) tl.x = x;
if ( y < tl.y ) tl.y = y;

// Update the bottom-right corner.
if ( x > br.x ) br.x = x;
if ( y > br.y ) br.y = y;
}
}
}

// If the image contains any non-zero pixels, then draw the bounding box.
if ( hasPoints )
cv::rectangle( image, tl, br, cv::Scalar( 255, 255, 255, 255 ) );

cv::namedWindow( "bounding-box" );
cv::imshow( "bounding-box", image );
cv::waitKey( 0 );

cv::imwrite( "bounding-box.png", image );
}

编辑 1:

我也喜欢上面@Micka 建议的想法,即使用 cv::boundingRect() .因此,在上面代码示例的循环内,您将推送所有 xy - 非零像素的位置到 std::vector< cv::Point >然后调用cv::boundingRect .在这种情况下,查看 convex hull 也很有趣。二维点云。

关于c++ - 在图像中的一些点周围绘制边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29372553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com