开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

楼主: 黄飞红
收起左侧

[C#] c# flost 问题

[复制链接]
结帖率:67% (28/42)
 楼主| 发表于 2025-1-9 16:38:04 | 显示全部楼层   辽宁省丹东市
尛龍科技 发表于 2025-1-9 16:14
[mw_shl_code=csharp,true]using OpenCvSharp;
using OpenCvSharp.Dnn;
using System;

(outs[n * 3].DataPointer == IntPtr.Zero || outs[n * 3 + 1].DataPointer == IntPtr.Zero || outs[n * 3 + 2].DataPointer == IntPtr.Zero


这段代码报错
回复

使用道具 举报

结帖率:67% (28/42)

签到天数: 13 天

 楼主| 发表于 2025-1-9 16:46:33 | 显示全部楼层   辽宁省丹东市
尛龍科技 发表于 2025-1-9 16:14
[mw_shl_code=csharp,true]using OpenCvSharp;
using OpenCvSharp.Dnn;
using System;

  // 确保 scores、bboxes 和 kps 数组的长度与 Mat 对象中的数据长度一致
                int scoresLength = outs[n * 3].Total() * outs[n * 3].Channels();
                int bboxesLength = outs[n * 3 + 1].Total() * outs[n * 3 + 1].Channels();
                int kpsLength = outs[n * 3 + 2].Total() * outs[n * 3 + 2].Channels();
这三行也是报错的
回复

使用道具 举报

结帖率:54% (7/13)

签到天数: 18 天

发表于 2025-1-9 16:48:28 | 显示全部楼层   浙江省嘉兴市
黄飞红 发表于 2025-1-9 16:46
// 确保 scores、bboxes 和 kps 数组的长度与 Mat 对象中的数据长度一致
                int scoresLe ...

Marshal.Copy还是报错吗
回复

使用道具 举报

结帖率:67% (28/42)

签到天数: 13 天

 楼主| 发表于 2025-1-9 16:53:39 | 显示全部楼层   辽宁省丹东市
尛龍科技 发表于 2025-1-9 16:48
Marshal.Copy还是报错吗

   Marshal.Copy(outs[n * 3].DataPointer, scores, 0, scores.Length);
                    Marshal.Copy(outs[n * 3 + 1].DataPointer, bboxes, 0, bboxes.Length);
                    Marshal.Copy(outs[n * 3 + 2].DataPointer, kps, 0, kps.Length);

是的,这个marshal.copy 也是报错的
回复

使用道具 举报

结帖率:54% (7/13)

签到天数: 18 天

发表于 2025-1-9 16:55:47 | 显示全部楼层   浙江省嘉兴市
黄飞红 发表于 2025-1-9 16:53
Marshal.Copy(outs[n * 3].DataPointer, scores, 0, scores.Length);
                    Marshal.Co ...

那等晚饭过后,我在给你看看,现在我要做饭了
回复

使用道具 举报

结帖率:67% (28/42)

签到天数: 13 天

 楼主| 发表于 2025-1-9 16:57:18 | 显示全部楼层   辽宁省丹东市
尛龍科技 发表于 2025-1-9 16:55
那等晚饭过后,我在给你看看,现在我要做饭了

嗯,//检查mat 对象是否有效,这部分代码应该不对
回复

使用道具 举报

结帖率:54% (7/13)

签到天数: 18 天

发表于 2025-1-9 17:00:20 | 显示全部楼层   浙江省嘉兴市
黄飞红 发表于 2025-1-9 16:46
// 确保 scores、bboxes 和 kps 数组的长度与 Mat 对象中的数据长度一致
                int scoresLe ...

临了做饭之前在看看
[C#] 纯文本查看 复制代码
using OpenCvSharp;
using OpenCvSharp.Dnn;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Card
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string startupPath;
        string image_path;

        private void Form1_Load(object sender, EventArgs e)
        {
            startupPath = System.Windows.Forms.Application.StartupPath;
            image_path = "1.jpg";
            pictureBox1.Image = new Bitmap(image_path);
            image = new Mat(image_path);
            opencv_net = CvDnn.ReadNetFromOnnx("carddetection_scrfd34gkps.onnx");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;

            pictureBox1.Image = null;
            pictureBox2.Image = null;
            textBox1.Text = "";

            image_path = ofd.FileName;
            pictureBox1.Image = new Bitmap(image_path);
            image = new Mat(image_path);
        }

        Stopwatch stopwatch = new Stopwatch();
        Net opencv_net;
        Mat BN_image;
        Mat image;
        Mat result_image;

        float[] stride = { 8.0f, 16.0f, 32.0f };
        int inpWidth = 640;
        int inpHeight = 640;
        float confThreshold = 0.5f;
        float nmsThreshold = 0.5f;
        bool keep_ratio = true;

        Mat resize_image(Mat srcimg, ref int newh, ref int neww, ref int top, ref int left)
        {
            int srch = srcimg.Rows, srcw = srcimg.Cols;
            newh = inpHeight;
            neww = inpWidth;
            Mat dstimg = new Mat();
            if (keep_ratio && srch != srcw)
            {
                float hw_scale = (float)srch / srcw;
                if (hw_scale > 1)
                {
                    newh = inpHeight;
                    neww = (int)(inpWidth / hw_scale);
                    Cv2.Resize(srcimg, dstimg, new OpenCvSharp.Size(neww, newh));
                    left = (int)((inpWidth - neww) * 0.5);
                    Cv2.CopyMakeBorder(dstimg, dstimg, 0, 0, left, inpWidth - neww - left, BorderTypes.Constant, 0);
                }
                else
                {
                    newh = (int)(inpHeight * hw_scale);
                    neww = inpWidth;
                    Cv2.Resize(srcimg, dstimg, new OpenCvSharp.Size(neww, newh));
                    top = (int)((inpHeight - newh) * 0.5);
                    Cv2.CopyMakeBorder(dstimg, dstimg, top, inpHeight - newh - top, 0, 0, BorderTypes.Constant, 0);
                }
            }
            else
            {
                Cv2.Resize(srcimg, dstimg, new OpenCvSharp.Size(neww, newh));
            }
            return dstimg;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(image_path))
            {
                return;
            }
            stopwatch.Restart();
            image = new Mat(image_path);
            result_image = image;

            int newh = 0, neww = 0, padh = 0, padw = 0;
            Mat img = resize_image(image, ref newh, ref neww, ref padh, ref padw);
            Mat blob = new Mat();

            BN_image = CvDnn.BlobFromImage(img, 1 / 128.0, new OpenCvSharp.Size(inpWidth, inpHeight), new Scalar(127.5, 127.5, 127.5), true, false);

            opencv_net.SetInput(BN_image);

            Mat[] outs = new Mat[3];
            string[] outBlobNames = opencv_net.GetUnconnectedOutLayersNames();
            opencv_net.Forward(outs, outBlobNames);

            List<float> confidences = new List<float>();
            List<Rect> boxes = new List<Rect>();
            List<List<int>> landmarks = new List<List<int>>();

            float ratioh = (float)image.Rows / newh, ratiow = (float)image.Cols / neww;

            for (int n = 0; n < 3; n++)
            {
                int num_grid_x = (int)(inpWidth / stride[n]);
                int num_grid_y = (int)(inpHeight / stride[n]);

                float[] scores = new float[num_grid_x * num_grid_y * 4];
                float[] bboxes = new float[num_grid_x * num_grid_y * 4 * 4];
                float[] kps = new float[num_grid_x * num_grid_y * 4 * 8];

                Marshal.Copy(outs[n * 3].DataPointer, scores, 0, scores.Length);
                Marshal.Copy(outs[n * 3 + 1].DataPointer, bboxes, 0, bboxes.Length);
                Marshal.Copy(outs[n * 3 + 2].DataPointer, kps, 0, kps.Length);

                for (int i = 0; i < num_grid_y; i++)
                {
                    for (int j = 0; j < num_grid_x; j++)
                    {
                        for (int k = 0; k < 4; k++)
                        {
                            int index = i * num_grid_x * 4 + j * 4 + k;
                            if (scores[index] > confThreshold)
                            {
                                int xmin = (int)(((j - bboxes[index * 4 + 0]) * stride[n] - padw) * ratiow);
                                int ymin = (int)(((i - bboxes[index * 4 + 1]) * stride[n] - padh) * ratioh);
                                int width = (int)((bboxes[index * 4 + 2] + bboxes[index * 4 + 0]) * stride[n] * ratiow);
                                int height = (int)((bboxes[index * 4 + 3] + bboxes[index * 4 + 1]) * stride[n] * ratioh);

                                confidences.Add(scores[index]);
                                boxes.Add(new Rect(xmin, ymin, width, height));

                                List<int> landmark = new List<int>();
                                for (int l = 0; l < 8; l += 2)
                                {
                                    landmark.Add((int)(((j + kps[index * 8 + l]) * stride[n] - padw) * ratiow));
                                    landmark.Add((int)(((i + kps[index * 8 + l + 1]) * stride[n] - padh) * ratioh));
                                }
                                landmarks.Add(landmark);
                            }
                        }
                    }
                }
            }

            int[] indices;
            CvDnn.NMSBoxes(boxes, confidences, confThreshold, nmsThreshold, out indices);

            if (indices.Length > 0)
            {
                for (int i = 0; i < indices.Length; ++i)
                {
                    int idx = indices;
                    Rect box = boxes[idx];
                    Cv2.Rectangle(result_image, new OpenCvSharp.Point(box.X, box.Y), new OpenCvSharp.Point(box.X + box.Width, box.Y + box.Height), new Scalar(0, 0, 255), 2);
                    for (int k = 0; k < 8; k += 2)
                    {
                        Cv2.Circle(result_image, new OpenCvSharp.Point(landmarks[idx][k], landmarks[idx][k + 1]), 10, new Scalar(0, 255, 0), -1);
                    }
                    string label = confidences[idx].ToString("P2");
                    int baseLine;
                    OpenCvSharp.Size labelSize = Cv2.GetTextSize(label, HersheyFonts.HersheySimplex, 0.5, 2, out baseLine);
                    int top = Math.Max(box.Y, labelSize.Height);
                    Cv2.PutText(result_image, label, new OpenCvSharp.Point(box.X, top - 10), HersheyFonts.HersheySimplex, 1, new Scalar(0, 255, 0), 2);
                }
            }
            else
            {
                MessageBox.Show("没有检测到任何卡片");
            }

            stopwatch.Stop();
            double costTime = stopwatch.Elapsed.TotalMilliseconds;
            textBox1.Text = $"耗时:{costTime:F2}ms";
            pictureBox2.Image = new Bitmap(result_image.ToMemoryStream());
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (pictureBox2.Image == null)
            {
                return;
            }
            Bitmap output = new Bitmap(pictureBox2.Image);
            var sdf = new SaveFileDialog();
            sdf.Title = "保存";
            sdf.Filter = "Images (*.jpg)|*.jpg|Images (*.png)|*.png|Images (*.bmp)|*.bmp";
            if (sdf.ShowDialog() == DialogResult.OK)
            {
                switch (sdf.FilterIndex)
                {
                    case 1:
                        output.Save(sdf.FileName, ImageFormat.Jpeg);
                        break;
                    case 2:
                        output.Save(sdf.FileName, ImageFormat.Png);
                        break;
                    case 3:
                        output.Save(sdf.FileName, ImageFormat.Bmp);
                        break;
                }
                MessageBox.Show("保存成功,位置:" + sdf.FileName);
            }
        }
    }
}

把多余的打印删除了
顺便简化了下代码
回复

使用道具 举报

结帖率:67% (28/42)

签到天数: 13 天

 楼主| 发表于 2025-1-9 17:15:24 | 显示全部楼层   辽宁省丹东市
尛龍科技 发表于 2025-1-9 17:00
临了做饭之前在看看
[mw_shl_code=csharp,true]using OpenCvSharp;
using OpenCvSharp.Dnn;

Marshal.Copy(outs[n * 3].DataPointer, scores, 0, scores.Length);
                Marshal.Copy(outs[n * 3 + 1].DataPointer, bboxes, 0, bboxes.Length);
                Marshal.Copy(outs[n * 3 + 2].DataPointer, kps, 0, kps.Length);

上面这三行还是报错

补充内容 (2025-1-9 17:19):
其余的没有报错了
回复

使用道具 举报

结帖率:54% (7/13)

签到天数: 18 天

发表于 2025-1-9 18:45:20 | 显示全部楼层   浙江省嘉兴市
黄飞红 发表于 2025-1-9 17:15
Marshal.Copy(outs[n * 3].DataPointer, scores, 0, scores.Length);
                Marshal.Copy(out ...

报错位置看看
回复

使用道具 举报

结帖率:67% (28/42)

签到天数: 13 天

 楼主| 发表于 2025-1-10 07:56:33 | 显示全部楼层   辽宁省丹东市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表